jhmilan
(Jhmilan)
February 4, 2013, 3:39pm
1
Hola a todos,
Estoy intentando hacer una relación HAS_MANY y tengo un error. Me explico rápidamente:
Tengo un model ‘User’ que se relaciona con ‘Job’ y con ‘JobMessage’ a través de ‘Job’.
//en relations() de User
...
'jobs' => array(self::HAS_MANY, 'Job', 'author_id'),
'jobmessages' => array(self::HAS_MANY, 'JobMessage', array('id'=>'job_id'),'through' => 'jobs'),
...
la pk y fk son
tbl_Job.author_id -> tbl_User.id
tbl_Job.id -> tbl_JobMessage.job_id
Pues bien el error que recibo es:
PHP Error
preg_split() expects parameter 2 to be string, array given
630 foreach($params as $name=>$value)
631 $query->params[$name]=$value;
632 }
633 else
634 throw new CDbException(Yii::t('yii','The relation "{relation}" in active record class "{class}" is specified with an incomplete foreign key. The foreign key must consist of columns referencing both joining tables.',
635 array('{class}'=>get_class($parent->model), '{relation}'=>$this->relation->name)));
636 }
637 else
638 {
639 $element=$this;
640 while($element->slave!==null)
641 {
642 $fks=preg_split('/\s*,\s*/',$element->relation->foreignKey,-1,PREG_SPLIT_NO_EMPTY);
643 if($element->slave->slave===null)
644 {
645 $fke=$element->slave;
646 $pke=$element;
647 }
648 else // nested through detected
649 {
650 $fke=$element;
651 $pke=$element->slave;
652 }
653 $query->joins[]=$element->slave->joinOneMany($fke,$fks,$pke,$parent);
654 $element=$element->slave;
¿Alguna idea?
Gracias
carreraj
(Carreraj)
February 4, 2013, 6:17pm
2
Hola a todos,
Estoy intentando hacer una relación HAS_MANY y tengo un error. Me explico rápidamente:
Tengo un model ‘User’ que se relaciona con ‘Job’ y con ‘JobMessage’ a través de ‘Job’.
//en relations() de User
...
'jobs' => array(self::HAS_MANY, 'Job', 'author_id'),
'jobmessages' => array(self::HAS_MANY, 'JobMessage', array('id'=>'job_id'),'through' => 'jobs'),
...
la pk y fk son
tbl_Job.author_id -> tbl_User.id
tbl_Job.id -> tbl_JobMessage.job_id
Creo que tienes al revés los campos de la relación through. El orden es campo de jobmessage=>campo de job.
//en relations() de User
...
'jobs' => array(self::HAS_MANY, 'Job', 'author_id'),
'jobmessages' => array(self::HAS_MANY, 'JobMessage', array('job_id'=>'id'),'through' => 'jobs'),
...
Aunque el error que indicas no me cuadra con lo que creo que pasa, igual te sirve.
jhmilan
(Jhmilan)
February 4, 2013, 6:28pm
3
Hola Juan,
Gracias por tu respuesta tan rápida. Tienes razón, le he dado tantas vueltas que al final lo he dejado mal. Lo he cambiado pero sigue igual.
Voy a probar algo y os informaré de si he tenido suerte… Estoy trabajando en una aplicación donde no tengo posibilidad de alterar la BD y tuve un problema con una MANY_MANY (la solucion fue establecer correctamente la pk en el Model …)
Voy a probar.
Un saludo
jhmilan
(Jhmilan)
February 4, 2013, 6:34pm
4
Hola Juan,
Gracias por tu respuesta tan rápida. Tienes razón, le he dado tantas vueltas que al final lo he dejado mal. Lo he cambiado pero sigue igual.
Voy a probar algo y os informaré de si he tenido suerte… Estoy trabajando en una aplicación donde no tengo posibilidad de alterar la BD y tuve un problema con una MANY_MANY (la solucion fue establecer correctamente la pk en el Model …)
Voy a probar.
Un saludo
Mala suerte, no era eso. ¿Alguna alternartiva?
carreraj
(Carreraj)
February 4, 2013, 8:33pm
5
¿Qué version del framework utilizas? y puestos a preguntar ¿en que clase da el error?
jhmilan
(Jhmilan)
February 4, 2013, 9:19pm
6
Solved! (Mil gracias Juan)
Tenía la versión 1.1.8 (es un proyecto que ya estaba en marcha y no miré la versión… mal hecho).
Aunque en la documentación dice que ‘through’ está disponible desde 1.1.7 el código del ejemplo no funciona… imagino que una versión posterior refactorizaron algo relativo a ‘through’.
Todo funcion ‘like a charm’ utilizando la 1.1.13.
Creo que habría que poner una pequeña nota en los docs diciendo que el ejemplo (confirmado) funciona en 1.1.13 pero no en 1.1.8 (desconozco a partir de que versión funciona).
Gracias!