CakePHP: read() y las habtm - Userlinux.net

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…

CakePHP: read() y las habtm

06.Feb.2008 ~ 21 Comentarios ~ 1929 Lecturas
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().

Comentarios


gravatar
10.Feb.2008
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
11.Feb.2008
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.Feb.2008
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...

gravatar
Luciano
14.Oct.2008
Yo he tenido problemas con las asociaciones HABTM. He seguido al pie de la letra la creación del ejemplo posts - tags en el modelo, el controlador, la vista y las tablas de la base de datos y cuando hago $this->set('posts',$this->Post->find('all')); resulta que me pasa los datos de los posts pero no me pasa los datos de los tags asociados a la vista, tambien probe hacer print_r($this->Post->find('all')); en el controlador y me muestra: Array ( [0] => Array ( [Post] => Array ( [id] => 1 [cuerpo] => lalalalalalalala [fecha] => 2008-10-13 ) [Tag] => Array ( ) ) [1] => Array ( [Post] => Array ( [id] => 2 [cuerpo] => lolololololololo [fecha] => 2008-10-12 ) [Tag] => Array ( ) ) [2] => Array ( [Post] => Array ( [id] => 3 [cuerpo] => tatatatatatatata [fecha] => 2008-10-05 ) [Tag] => Array ( ) ) ) o sea que ya al controlador llegan los arrays de tags vacios. No tengo ni la mas minima idea que puede ser, estoy usando una base de datos firebird en un windows Vista lo cual no creo que tenga nada que ver, si alguien me puede dar una mano se lo agradeceria mucho.

gravatar
Luciano
14.Oct.2008
Ya lo he verificado, probe el mismo ejemplo de posts y tags en una base de datos mysql y funciono bien la relación habtm. Conclusión: con algunas consultas falla el driver usado por cakephp para la base de datos firebird.

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés