CakePHP: read() y las habtm
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().
Comentarios
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.
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...