Problema Con Through

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

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.

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?

¿Qué version del framework utilizas? y puestos a preguntar ¿en que clase da el error?

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!