【问题标题】:YII CActiveDataProvider with relational tables带有关系表的 YII CActiveDataProvider
【发布时间】:2011-12-06 15:42:41
【问题描述】:

我有三张桌子:

  • 内容 (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'),

我需要获取具有特定类别的所有内容记录(在 CActiveDataProvider 中以在 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',
                        ),
                    ),
                ),
            )
        );

我该怎么做?

非常感谢!

【问题讨论】:

    标签: yii


    【解决方案1】:

    当表关联为 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 的情况下使用它,请将其添加到参数中,如下所示:

    'criteria'=>array(
       'with'=>array(
           'Categories'=>array(
                'condition'=>'id_category=1'
            ),
        ),
        'together'=>true,
    ),
    

    【讨论】:

    • 我爱你,格雷格!我有一种感觉,我将来某个时候也会有同样的疑问,所以我会把这个收藏起来,知道在哪里可以找到答案。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多