2011-12-06 95 views
4

我有三個表:YII CActiveDataProvider與關係表

  • 內容(ID)
  • 內容分類(id_content,id_category)
  • 類別(ID)內容的

關係,

'Categories' => array(self::MANY_MANY, 'Category', 'ContentCategory(id_content, id_category)'), 
'category' => array(self::HAS_MANY, 'Category', 'id'), 

我需要d來獲取具有某種特定類別的內容的所有記錄(在CActiveDataProvider中用於CListView中)。

當我使用的findAll(),我得到的記錄我想要的(它的工作原理),

$model=Content::model()->with(array(
'Categorieses'=>array(
    'condition'=>'id_category=1', 
), 
))->findAll(); 

但是,當我與CActiveDataProvider做我得到的所有內容(記錄不具有特定的那些類別 - 不起作用)

$dataProvider=new CActiveDataProvider('Content', 
     array(
       'pagination'=>array('pageSize'=>15), 
       'criteria'=>array(
        'with'=>array(
         'Categories'=>array(
          'condition'=>'id_category=1', 
         ), 
        ), 
       ), 
      ) 
     ); 

我該怎麼做?

非常感謝!

回答

13

當表相關MANY_MANY或HAS_MANY,Yii中有時可以打破單一的查詢到兩個SQL語句。我相信這是爲了提高效率,但它可能會搞砸你想要做的事情,因爲Categories查詢發生在與Contact查詢不同的SQL語句中。

解決方法是使用CDbCriteria的鮮爲人知的屬性together。如果將其設置爲true,則會強制查詢從同一SQL語句中的兩個表中進行選擇。你的病情將會有效。

如果你總是希望這樣的事情發生,它添加到關係:

Categories' => array(self::MANY_MANY, 'Category', 'ContentCategory(id_content, id_category)','together'=>true), 

如果你想它只是在上面的$dataProvider情況下,將其添加到參數如下:

​​
+0

我愛你格雷格!我有一種感覺,我將在未來的某個時候有同樣的懷疑,所以我會把這個書籤收藏起來,以便知道在哪裏查找答案。 –