La unión de Yii AR no funciona cuando se usa findAll
Frecuentes
Visto 5,274 veces
2
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.
2 Respuestas
5
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
2
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 php yii or haz tu propia pregunta.
Lamento molestarlo @bool.dev, pero ¿cómo puedo mostrar los datos que obtuve de la segunda tabla? Lo intenté
echo $menu->name
yecho $menu->menulanguages->name
Pero no está funcionando. Pero soy capaz de ver el valor dename
(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.devPERFECTO.. Eres genial ;) - ajaybc