1

我有 3 个表:TopicsUsersDetails这些是自定义论坛的一些表)

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

但正如您可以想象的那样,它不起作用(读作它没有从 tbles 用户或详细信息中选择任何内容)。

我的代码有什么问题?


+++++++++++++++++

此代码从表用户(和主题表)中选择字段:

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
4

2 回答 2

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();
于 2012-09-10T12:32:57.137 回答
2

而不是线

'with'=>array('user.details')

采用

'with'=>array('user')

然后加

$criteria->compare( 'user.details', $query, true );
$criteria->together = true;
}

*其中 $query 是一个将在列详细信息中搜索的变量

于 2015-04-14T15:44:47.567 回答