我有两个表tbl_entries和tbl_votings
tbl_entries -> id, othercolums
tbl_votings -> id, entry_id, othercolumns
我想在tbl_entries中显示zii.widgets.CListView中的数据,如果用户已投票选中这些条目。
我能够在sql查询下成功运行。
select * from tbl_entries where id in (select tbl_entries.id from tbl_votings where entry_id = tbl_entries.id )
我怎么能用YII风格这样才能在CListView中显示结果?
答案 0 :(得分:1)
在Entries
模型中添加关系:
...
'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
...
然后通过AR搜索:
$records = Entries::model()->with('votes')->findAll();
希望这有帮助。
答案 1 :(得分:0)
<强>更新强>
好的,我错过了#34;如果&#34;在你的帖子中,并认为只有在用户投票的情况下才需要输入。阅读以下更新以获取正确的代码我留给你第一部分,以防你将来需要它。 INNER JOIN仅在条目至少有1票时才会参赛。
------------------ FIRST PART(错误)--------------------
在Entries
模型中声明关系:
public function relations() {
return array(
'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
);
}
当您创建数据提供者时,请执行以下操作:
$dataProvider = new CActiveDataProvider('Entries',
array(
'criteria' => array(
'with' => array(
'votes'=>array(
'joinType' => 'INNER JOIN'
)
)
)
)
);
这不会创建您上面编写的SQL,但这将以正确的方式执行。 SQL看起来类似于:
select * from tbl_entries t INNER JOIN tbl_votings v ON t.id = v.entry_id
-----------------第二部分(右)------------------
<强>更新强>
好的,所以如果你只是需要获得参赛作品并为他们投票,你可以从第一部分做同样的关系声明:
public function relations() {
return array(
'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
);
}
您可以像这样创建数据提供者:
$dataProvider = new CActiveDataProvider('Entries',
array(
'criteria' => array(
'with' => array('votes')
)
)
);