yii2 gridview没有使用hasMany关系显示所有左连接值
Posted
技术标签:
【中文标题】yii2 gridview没有使用hasMany关系显示所有左连接值【英文标题】:yii2 gridview not showing all the left join values using hasMany retionship 【发布时间】:2015-07-14 17:34:55 【问题描述】:型号搜索:
$query = Countries::find()->joinWith(['states']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'defaultOrder' => ['doc_date'=>SORT_DESC],
]);
if (!($this->load($params) && $this->validate()))
return $dataProvider;
型号:
public function getStates()
return $this->hasMany(States::className(), ['state_id' => 'state_id']);
我需要类似的结果
Id Country State
1 India State 1
2 India State 2
3 India State 3
4 USA USA State1
5 USA USA State2
当我使用 gridview 时,我得到以下结果
Id Country State
1 India State 1
4 USA USA State1
请给出解决此问题的解决方案。
【问题讨论】:
【参考方案1】:好吧groupBy
帮了我
看看这个(希望对你有帮助)
$query = Post::find();
$query->innerJoinWith(['userVotePosts'], true);
$dataProvider = new ActiveDataProvider([
'query' => $query
]);
【讨论】:
【参考方案2】:您看到的是预期的行为:通常您不希望 ActiveRecord 查询包含重复的主记录,因此 Yii 过滤掉由 JOIN 引起的任何重复。您可以在此处看到此行为的定义:https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveQuery.php#L220
由于您想要的本质上是使用 JOIN 显示由 SQL 生成的原始结果(国家和州的每种组合一行),我认为最实用的解决方案是使用 SqlDataProvider
而不是ActiveDataProvider
。
这应该返回你想要的:
$query = Countries::find()->joinWith(['states'], false)->select(*);
$dataProvider = new SqlDataProvider([
'sql' => $query->createCommand()->getRawSql(),
]);
【讨论】:
注意:如果要使用分页功能,必须将 [[yii\data\SqlDataProvider::$totalCount]] 属性配置为总行数(不分页)。更多:yiiframework.com/doc/guide/2.0/en/…【参考方案3】:laszlovl 给出的答案效果很好,但需要通过 'sql' 更改 'query' 键值,如下所示:
$query = Countries::find()->joinWith(['states'], false)->select(*);
$dataProvider = new SqlDataProvider([
'sql' => $query->createCommand()->getRawSql(),
]);
从Yii 2 Docs 我们可以发现 $sql 属性获取用于获取数据行的 SQL 语句。该属性的默认值为“null”
【讨论】:
【参考方案4】:如果您使用select()
方法显式指定选定的列,您可以获得相同的结果,而不会弄乱原始 sql 查询
$query->select(['countries.*','states.*']);
【讨论】:
以上是关于yii2 gridview没有使用hasMany关系显示所有左连接值的主要内容,如果未能解决你的问题,请参考以下文章
在使用pjax重新加载gridview后,在gridview上的Yii2模态表单更新没有显示
不加载kartik 的select2 作为GridView 中的过滤器。 Yii2
Yii2框架学习 3-3 单条数据详情展示; 小部件 DetailView的使用 ; 数据关联查询时 hasOne和hasMany