CakePHP: read() y las habtm

06.feb 2008 Envía un trackback

Dados dos modelos relacionados N:M, lo que en Cake se llama una hasAndBelongsToMany (HABTM) supongamos un simple update del campo status del modelo principal.

Para ser más concretos, dados los modelos Posts y Tags, al ejecutar la función admin_status() para cambiar el estado de un Post -de activo a inactivo o viceversa- CakePHP hace cosas bastante raras con los tags relacionados, los borra. La función es la siguiente:


function admin_status($id = null)
{
        $this->data = $this->Post->read(null, $id);
       
        if($this->data['Post']['status']==1)
                $this->data['Post']['status']=0;
        else
                $this->data['Post']['status']=1;
               
        $this->Post->saveField('status', $this->data['Post']['status']);
}
 
Incomprensible, he probado a guardar con save(), con saveField(), hacer unbindModel en controlador, en beforeSave() y nada parecía funcionar.

Al final con un poco de pericia -y algo de suerte- cambiando el read() por un find() todo ha funcionado. La función queda tal que así:
function admin_status($id = null)
{
        $this->data = $this->Post->find('first',array('conditions'=>array('Post.id'=>$id)));
       
        if($this->data['Post']['status']==1)
                $this->data['Post']['status']=0;
        else
                $this->data['Post']['status']=1;
               
        $this->Post->saveField('status', $this->data['Post']['status']);
}
 
Que yo sepa ni read() está deprecated ni he hecho un uso raro o anormal de la misma. Estas cosas hacen que la noche me confunda más si cabe. Ahí dejo la data.

Actualización: La combinación find() y save() tampoco funcionan demasiado bien, solo lo hace con saveField() como he puesto en el ejemplo, por lo tanto lo correcto sería usar find() con saveField().
bake cake habtm read() find()

Comentarios
Gravatar coder@10.02.2008, 'Re: CakePHP: read() y las habtm'

A mí estos frameworks mastodónticos no se me dan bien. Es un hecho, no sé si porque soy demasiado corto de mente, porque la curva es demasiado larga o por qué motivo, pero me acaban sacando de mis casillas al no hacer lo que estoy pidiendo, y encima tragan recursos cosa mala.

Gravatar r0sk@11.02.2008, 'Re: CakePHP: read() y las habtm'

Cierto que la curva es larga y muy poco pronunciada en un principio. Y si, chupa recursos si no lo sabes controlar, pero normalmente siempre que hay un problema suele haber solución.

Por el momento me he sentido muy agusto con CakePHP aunque la falta de documentación -o el caos de la existente- lo hacen desconcertante a veces. Una vez te acostumbras a la magia es difícil echarse atrás.

Gravatar igurpi@12.02.2008, 'Re: CakePHP: read() y las habtm'

Tengo el mismo problema. Si solo tienes que actualizar un campo tu solución es buena al usar saveField pero si son varios campos, las consultas a la BBDD se multiplican y no se si es buena solución. Yo lo corregí eliminando la relación en el beforeSave():
function beforeSave()
{
$this->unbindModel(array('hasAndBelongsToMany' =>
array('Tag')));

return true;
}

Pero me sigue pareciendo una solución un poco "sucia". Alguien entiende el comportamiento de cake 1.2.0.6311 en este tema? Con anteriores versiones no sucedia esto...


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]