0

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

4

2 回答 2

1

Entries模型中添加关系:

...
'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
...

然后通过 AR 搜索:

$records = Entries::model()->with('votes')->findAll();

希望这可以帮助。

于 2012-04-07T06:45:13.400 回答
0

更新

好的,我在您的帖子中错过了“如果”一词,并认为只有当用户投票支持时您才需要条目。阅读下面的更新以获取正确的代码。我把第一部分留给你,以防你将来需要它。仅当条目至少有 1 票时,INNER JOIN 才会接受条目。

------------------ 第一部分(错误)------------------

在模型中声明一个关系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')
        )
    )
);
于 2012-04-07T15:35:37.813 回答