我有3个表:Topics
,Users
和Details
(这些是自定义论坛的一些表格)
Topics
包含(在其他常用字段中)创建主题的用户的ID(FK)。
Users
包含nick / pass和id(PK)
Details
包含(在其他常用字段中)用户的ID(FK)。
关系: 一个用户可以拥有一个1个细节。 一个用户可以拥有多个主题,但只能由一个用户创建主题。
主题关系:
return array(
'user' => array(self::BELONGS_TO, 'User', 'User_iduser'),
);
用户关系:
return array(
'details' => array(self::HAS_ONE, 'Details', 'User_iduser'),
);
我正在尝试获取包含主题和用户详细信息的列表(例如,主题名称和用户名称)。
目前我有这个:
$dataProvider=new CActiveDataProvider('Topic', array(
'criteria'=>array(
'with'=>array('user.details')
)
));
但是你可以想象,它不起作用(因为它没有从用户或细节中选择任何东西)。
我的代码出了什么问题?
+++++++++++++++
此代码选择表用户(和主题表)中的字段:
Topic::model()->with('user')->findAll();
但是这个不会从细节,用户和主题中选择:
Topic::model()->with('user.details')->findAll();
另外,我需要一个CActiveDataProvider
解决方案,因为我需要它用于zii小部件(意味着,即使对Topic::model()->with()....
代码进行某种修改,也可以从3个表中选择它不会真有帮助)
编辑:(来自Yii的SQL日志)
Querying SQL: SELECT COUNT(DISTINCT `t`.`idtema`) FROM `tema` `t` LEFT
OUTER JOIN `usuario` `usuarioIdusuario` ON
(`t`.`Usuario_idusuario`=`usuarioIdusuario`.`idusuario`) LEFT OUTER JOIN
`detallesusuario` `detallesusuario` ON
(`detallesusuario`.`Usuario_idusuario`=`usuarioIdusuario`.`idusuario`)
Querying SQL: SELECT `t`.`idtema` AS `t0_c0`, `t`.`Usuario_idusuario` AS
`t0_c1`, `t`.`Categoria_idcategoria` AS `t0_c2`, `t`.`tema` AS `t0_c3`,
`t`.`fecha_hora` AS `t0_c4`, `usuarioIdusuario`.`idusuario` AS `t1_c0`,
`usuarioIdusuario`.`nick` AS `t1_c1`, `usuarioIdusuario`.`contrasena` AS
`t1_c2`, `usuarioIdusuario`.`email` AS `t1_c3`,
`detallesusuario`.`Usuario_idusuario` AS `t2_c0`,
`detallesusuario`.`nombre` AS `t2_c1`, `detallesusuario`.`apellidos` AS
`t2_c2`, `detallesusuario`.`cumpleanos` AS `t2_c3`,
`detallesusuario`.`telefono1` AS `t2_c4`, `detallesusuario`.`telefono2` AS
`t2_c5` FROM `tema` `t` LEFT OUTER JOIN `usuario` `usuarioIdusuario` ON
(`t`.`Usuario_idusuario`=`usuarioIdusuario`.`idusuario`) LEFT OUTER JOIN
`detallesusuario` `detallesusuario` ON
(`detallesusuario`.`Usuario_idusuario`=`usuarioIdusuario`.`idusuario`)
LIMIT 10
答案 0 :(得分:2)
试试这个
$dataProvider=new CActiveDataProvider('Topic', array(
'criteria'=>array(
'with'=>array('user'=>array('alias'=>'user','with'=>array('details'=>array('alias'=>'details'))))
)
));
并且
Topic::model()->with(array('user'=>array('alias'=>'user','with'=>array('details'=>array('alias'=>'details')))))->findAll();
答案 1 :(得分:2)
而不是
行'with'=>array('user.details')
使用
'with'=>array('user')
然后添加
$criteria->compare( 'user.details', $query, true );
$criteria->together = true;
}
*其中$ query是将在列详细信息中搜索的变量