La unión de Yii AR no funciona cuando se usa findAll

Tengo dos mesas menus y lang_menus. Mi Menus modelo es el siguiente:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
                'menulanguages'=>array(self::HAS_MANY, 'MenuLangs', 'menuId'),
    );
}
...
public function getMenus(){
        $criteria = new CDbCriteria();
        $criteria->condition = "t.clientId = ".Yii::app()->user->clientId." AND menulanguages.languageId = ".Yii::app()->user->userlanguage;


        $count = Menus::model()->with('menulanguages')->count($criteria);

        $pages=new CPagination($count);
        //Results per page
        $pages->pageSize=10;
        $pages->applyLimit($criteria);

        $menus = Menus::model()->with('menulanguages')->findAll($criteria);
        return array('menus' => $menus, 'paging' => $pages);
    }

Esto esta lanzando el error Unknown column 'menulanguages.languageId'. el error esta en la linea $menus = Menus::model()->with('menulanguages')->findAll($criteria);.

Sorprendentemente estoy obteniendo el valor de la variable. $count correctamente.

Al mirar el registro, puedo ver que la consulta SQL que se está ejecutando para la consulta findAll es:

SELECT `t`.`id` AS `t0_c0`, `t`.`clientId` AS `t0_c1`, `t`.`restaurantId` AS `t0_c2` FROM `posif_menus` `t` WHERE (t.clientId = 1 AND menulanguages.languageId = 2) LIMIT 10

lo que significa que la unión no ha tenido lugar. Mientras que la consulta de unión adecuada se está ejecutando para el valor de conteo. Estoy haciendo algo mal ? Por favor ayuda.

preguntado el 22 de mayo de 12 a las 07:05

2 Respuestas

Sólo tiene que utilizar together() de CActiveRecord or together propiedad de CDbCriteria:

$menus = Menus::model()->with('menulanguages')->together()->findAll($criteria);

o bien:

$criteria = new CDbCriteria();
$criteria->condition = "t.clientId = ".Yii::app()->user->clientId." AND menulanguages.languageId = ".Yii::app()->user->userlanguage;
$criteria->together=true;

contestado el 22 de mayo de 12 a las 08:05

Lamento molestarlo @bool.dev, pero ¿cómo puedo mostrar los datos que obtuve de la segunda tabla? Lo intenté echo $menu->name y echo $menu->menulanguages->name Pero no está funcionando. Pero soy capaz de ver el valor de name (que es un campo en la segunda tabla) al hacer un var_dump en el objeto de resultado. - ajaybc

$menu es una matriz de objetos de menú, cada uno con objetos de lenguajes de menú relacionados, por lo que tendrá que hacer echo $result['menus'][0]->menulanguages[0]->name; - bool.dev

PERFECTO.. Eres genial ;) - ajaybc

Pruebe esto ... aplique la tabla de unión en cdbcriteria ...

public function getMenus(){
        $criteria = new CDbCriteria();
        $criteria->condition = "t.clientId = ".Yii::app()->user->clientId." AND                                               menulanguages.languageId = ".Yii::app()->user->userlanguage;
        $criteria->with = array('menulanguages');

        $count = Menus::model()->count($criteria);

        $pages=new CPagination($count);
        //Results per page
        $pages->pageSize=10;
        $pages->applyLimit($criteria);

        $menus = Menus::model()->findAll($criteria);
        return array('menus' => $menus, 'paging' => $pages);
    }

contestado el 22 de mayo de 12 a las 09:05

No está trabajando. Mostrando el mismo error de SQL. La consulta sigue siendo la misma. También debería ser $criteria->with = 'menulanguages' - ajaybc

prueba esto... $criterios->with = array('menulanguages'); - Owais Iqbal

Lo conseguí trabajando con la solución de bool.dev. Pero aún no puedo entender cómo imprimir el valor de los campos de la tabla unida en la vista. Lo intenté echo $menu->name y echo $menu->menulanguages->name Pero no está funcionando. Pero puedo ver el valor del nombre (que es un campo en la segunda tabla) al hacer un var_dump en el objeto de resultado. - ajaybc

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.