YII CActiveDataProvider与关系表

时间:2011-12-06 15:42:42

标签: yii

我有三张桌子:

  • 内容(id)
  • ContentCategory(id_content,id_category)
  • 类别(id)

内容关系

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

我需要获取具有某些特定类别的内容的所有记录(在CAistDataProvider中用于CListView)。

当我使用findAll()时,我得到了我想要的记录(它可以工作),

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

但是当我使用CActiveDataProvider时,我获得了Content中的所有记录(不是具有特定类别的记录 - 不起作用)

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

我该怎么做?

非常感谢!

2 个答案:

答案 0 :(得分:13)

当表与MANY_MANY或HAS_MANY相关时,Yii有时可以将单个查询分成两个SQL语句。我相信这是为了提高效率,但它可能会像你试图做的那样搞乱,因为Categories查询发生在与Contact查询不同的SQL语句中。

解决方案是使用名为CDbCriteria的{​​{1}}鲜为人知的属性。如果将其设置为true,则会强制查询从同一SQL语句中的两个表中进行选择。你的条件将有效。

如果您总是希望这样,请将其添加到关系:

together

如果您只想在上述Categories' => array(self::MANY_MANY, 'Category', 'ContentCategory(id_content, id_category)','together'=>true), 案例中使用它,请将其添加到以下参数中:

$dataProvider

答案 1 :(得分:-1)