Yii CActiveDataProvider with() 并加入

Posted

技术标签:

【中文标题】Yii CActiveDataProvider with() 并加入【英文标题】:Yii CActiveDataProvider with() and join 【发布时间】:2014-08-18 09:46:52 【问题描述】:

我希望 CGridView 中的每个相关对象都有单独的行。

ModelB有modelAId,所以是HAS_MANY关系。

以下查询返回我想要获取的内容:

select * from modelA a
join modelB b on b.modelAId = a.id

这里我为每个对应的 modelB 行获取单独的行,来自 modelA 的记录可能重复。

但是,以下提供程序没有返回预期的记录,我如何在 CActiveDataProvider 中使用它

$provider = new CActiveDataProvider ("ModelA", array ("criteria" => array (
            "with" => array("ModelB")
            )
        ));

如果我添加 join "join" => " join modelB b on b.modelAId = t.id",并删除 with() 它会给出正确的记录,但是当我包含 with() 时它只会给出 modelA 记录。

从 ModelA 获取数据的正确方法是什么,包括 ModelB 关系的单独行?

【问题讨论】:

模型中的关系是如何定义的?这很可能是不正确的。您还可以在条件中使用联接。 【参考方案1】:

您可以使用 cDbCriteria 以最简单的方式实现这一点

$criteria=new cDbCriteria();
$criteria->with=array('ToModelB'); //Here ToModelB is defined relation in ModelA to ModelB
$dataProvider=new CActiveDataProvider('ModelA',array('criteria'=>$criteria));

但在此之前,请确保为这两个模型定义了正确的关系。

【讨论】:

我也在使用 Criteria,但是这样我可以像这样访问所有 modelB 对象:$provider->data->modelB。在 CGridView 中,我不能为每个 modelB 对象设置单独的行。这就是我想要实现的:在CGridView中,应该可以有modelB的关系记录,例如对于每个modelA对象我可能有几个modelB对象,所以它们都应该在不同的行中

以上是关于Yii CActiveDataProvider with() 并加入的主要内容,如果未能解决你的问题,请参考以下文章

如何迭代 Yii CActiveDataProvider 对象?

Yii CActiveDataProvider with() 并加入

Yii框架:Clistview报告的结果数量不正确

nginx下yii2设置路由规则

yii2 url 美化参数

yii2 url 美化参数