2012-04-07 54 views
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中顯示結果?

回答

1

Entries模型添加關係:

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

然後通過AR搜索:

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

希望這有助於。

+0

我用您的解決方案。 $ dataProvider = Entries :: model() - > with('votes') - > findAll();放在CListView中,但它給出錯誤「致命錯誤:調用一個非對象的成員函數getData()in ...」 – 2012-04-07 07:19:16

0

更新

好吧,我錯過了一句話:「如果」在您的文章,並認爲你需要的條目只有當用戶投贊成票。閱讀下面的更新以獲取正確的代碼我留給你第一部分以防萬一你將來需要它。 INNER JOIN將只在參賽作品至少有1票時參賽。

------------------第一部分(錯誤)--------------------

聲明的關係你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') 
     ) 
    ) 
); 
相關問題