获取$ dataProvider变量中的相关记录

时间:2012-04-07 05:48:52

标签: php yii

我有两个表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中显示结果?

2 个答案:

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