hay una mejor manera de agragar un registro hijo?

Hola amigos, tengo una duda que no me la pude sacar buscando por ahí, así que ahí va!!

Hasta ahora vengo manejando la cuestión de la siguiente manera:





$padre = new Padre();

...

$padre->save();


$hijo = new Hijo();

$hijo->padre_id = $padre->id;

...

$hijo->save();




El código de arriba funciona, pero quizá haya alguna manera de hacerlo que refresque el atributo "$padre->hijos"?, algo como:




$padre->hijos->add($hijo);



solo por poner un ejemplo de lo que se me ocurre ahora, que incluso evitaría la necesidad de grabar el modelo padre antes de asignar el hijo, e incluso quizá evitaría la necesidad de grabar el hijo por separado?

Algún consejo?

Gracias

Mi espanhol es muy ruim, pero entiendo muy bien

Me voy a tratar de explicar sin hablar :)




class Padre{

  //code

  function relations(){

 	'hijos'=>array(self::HAS_MANY,'Hijo','padre_id'),

  }

}

///hijo

class Hijo{

  //code

  function relations(){

 	'padre'=>array(self::BELONGS_TO,'Padre','padre_id'),

  }

}



entonce puedes utilizar-lo de esta manera




$padre = Padre::model();

//nombre del hijos

foreach($padre->hijos as $hijo){

   echo $hijo->nombre;

}

//nombre del padre

$hijo= new Hijo;

$hijo->padre->nombre;



@Gustavo:

Hi, thanks for your response, and for your code, but I think you misunderstood me, what I meant was; how can I add a child in a different way than showed in the first part of my post:




$father = new Father();

...

$father->save();


$son = new Son();

$son->Father_id = $Father->id;

...

$Son->save();



and more like the second part:




$father = new Father();

$Son = new Son();

$father->sons->add($son);

$father->save();



Note that in the second code the object Son is not been saved, neither it’s id is being assigned, maybe even $father->sons could get updated with the new son.

Sorry for my english

Hola Juan,

Que yo sepa no hay nada parecido en lo que se refiere a guardar relaciones creadas de una manera rápida (no estaría mal crearla como un behavior). Igual te sirve este que hay en extensiones, aunque debo reconocer que no lo he probado: http://www.yiiframework.com/extension/save-relations-ar-behavior

Encontré un articulo en este foro que soluciona lo que pides: http://www.yiiframework.com/forum/index.php?/topic/5073-saving-relation/page__p__26452__hl__parent+relation++ave#entry26452

Hola Antonio, MUUUchas gracias por tu esfuerzo, ahora mismo voy a ver lo que me mandaste.

Hola Juan,

Es cierto lo que decís que es más fácil, pero no es simple de implementar para que funcione correctamente en todos los casos posibles. Samdark estuvo trabajando un poco con esto, pero a la vez, no es muy eficiente por lo que se esta decidiendo que es lo que se hace con respescto a esto.

Cualquier duda avisame.

Saludos,

Sebas

Gracias Sebas, entiendo perfectamente, era por curiosidad solamente, no es tanto trabajo hacerlo a mano y en algunos casos quizá sea mejor.

Quizá sepas (o Antonio) de alguna manera rápida de refrescar los HIJOS del PADRE una vez que agrego uno?

Si tuviera que hacerlo por comodidad en mis proyectos, porque realmente estamos hablando de eso, yo crearía un behavior del tipo CActiveRecordBehavior que tuviera simplemente un listado tipo CTypedList (CActiveRecord) que mantuviera la referencia de todos aquellos ‘hijos’ que añado. El listado se incrementa a través de un simple método de control que a su vez también pudiera crear objetos; algo así como addChild(‘ObjectType’,array(‘attribute’=>‘value’)) y que éste se relacionara al padre a través del analisis de las relaciones con ese objeto ( desde el Behavior: $this->getOwner()->relations()) justo antes o despues de guardar el objeto padre (onBeforeSave() o onAfterSave() desde el behavior, nos moveríamos en bucle a traves de CTypedList, sacamos el tipo de clase que es (‘ObjectType’), buscamos cual es su Foreign Key para relacionarla con el padre y guardar a posteriori el hijo).

Bueno al menos eso es lo que intentaría… creo que es bastante posible así. Y creandolo como un behavior, lo puedes añadir a todos aquellos modelos que desees.

Un saludo

Probaste con unset($this->hijos)??

y después lo llamás denuevo y refresca todos los ar. No es para usar en caso de aplicaciones que hagan esto mucho o con alto tráfico, pero funciona más rápido en desarrollo que otras cosas.

Saludos,

Solo por añadir… si lo haces con un CTypedList, tiene un metodo llamado clear que te puede ayudar. http://www.yiiframework.com/doc/api/1.1/CList#clear-detail.

CTypedList y CMapList han sido y son de gran ayuda en mis proyectos.

@Sebas, voy a probar el unset, a simple vista entiendo que debería de funcionar por ahora, quizá mas adelante siga investigando.

@Antonio, me parece que lo que me propones me queda un poco grande ;) no conozco el framework lo suficiente y estoy en medio de un proyecto, quizá mas adelate como le decía a Sebas lo intente, ahora mismo voy a releer tu post, pero creo que no tendría resuelto el tema de como actualizar los hijos del padre, o si?

Muchas gracias por su ayuda