Buscar con una tabla unida usando YII

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);

preguntado el 12 de junio de 12 a las 19:06

2 Respuestas

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

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 el true Valor en $criteria->compare( 'author.name', 'foo', true );) - Boris Belensky

compare() llamará addSearchCondition(), pero hará varias comprobaciones antes de eso. Donde addSearchCondition() is exactamente Qué estás buscando. - Boris Belensky

Gracias boris, has sido de gran ayuda. FabioCosta

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 or haz tu propia pregunta.