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关系显示所有左连接值的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 hasMany关系中如何在ON条件下使用常量

在使用pjax重新加载gridview后,在gridview上的Yii2模态表单更新没有显示

在Yii2 gridview中禁用分页

不加载kartik 的select2 作为GridView 中的过滤器。 Yii2

用到了yii2 hasMany() 方法,一对多关联

Yii2框架学习 3-3 单条数据详情展示; 小部件 DetailView的使用 ; 数据关联查询时 hasOne和hasMany