Buscar con una tabla unida usando YII
Frecuentes
Visto 3,771 equipos
1
Tengo la siguiente estructura de tabla. tb_posts tiene el campo author_id que se relaciona con tb_author.id en YII tengo lo siguiente en mis publicaciones activeRecord
public function relations()
{
return array(
'authorRelation' => array(self::BELONGS_TO, 'authorRecord', 'author')
);
}
¿Cómo hago una búsqueda de publicaciones de un autor con el nombre 'foo'? estoy intentando lo siguiente sin exito
$criteria=new CDbCriteria;
$criteria->with = array('authorRelation');
$criteria->together = true;
$criteria->compare( 'author.name', 'foo', true );
$posts=PostsRecord::model()->findAll($criteria);
2 Respuestas
1
Establezca un alias de tabla para sus modelos en init.
class PostsRecord extends CActiveRecord
{
// ...
public function init() { $this->setTableAlias( 'postsrecord' ); }
// ...
}
class AuthorRecord extends CActiveRecord
{
// ...
public function init() { $this->setTableAlias( 'authorrecord' ); }
// ...
}
Por último:
$condition=new CDbCriteria;
$condition->with = array('authorRelation');
$condition->together = true;
$condition->condition = 'authorrecord.name=:authorname';
$condition->params = array( ':authorname' => 'foo' );
$posts=PostsRecord::model()->findAll($condition);
Respondido el 12 de junio de 12 a las 20:06
1
Tu relación debe ser 'authorRelation' => array(self::BELONGS_TO, 'authorRecord', author_id')
. El tercer parámetro es la clave externa.
La segunda parte del código no tiene ningún error, la búsqueda debería funcionar si configuras las relaciones correctamente.
Respondido el 12 de junio de 12 a las 20:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php mysql yii or haz tu propia pregunta.
En realidad, usando authorRelation, el nombre funcionó en la condición, el resto del código pareció funcionar bien, gracias - fabiocosta
Tengo que señalar, que
$condition->condition
debe ser reemplazado por$condition->addSearchCondition(...)
(Acabo de notar ahora eltrue
Valor en$criteria->compare( 'author.name', 'foo', true );
) - Boris Belenskycompare()
llamaráaddSearchCondition()
, pero hará varias comprobaciones antes de eso. DondeaddSearchCondition()
is exactamente Qué estás buscando. - Boris BelenskyGracias boris, has sido de gran ayuda. fabiocosta