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?
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;
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.
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
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.
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.
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.
@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?