首页 > 解决方案 > 如果 dataProvider 包含 GROUP BY 和 INNER JOIN,Yii2 GridView 显示“(未设置)”

问题描述

我已经显示(仅显示,不完整的 CRUD)查询的结果,其构建如下:

SELECT SUM(a) AS ab, b, COUNT(*) as C
FROM x
INNER JOIN y
ON y.a = x.a
WHERE b=123
GROUP BY b

所以我在SearchModelssearch()方法中使用 ActiveRecord 构建了这个查询。
在表 a 的模型中,我添加了一个hasOne()- 关系。

为了显示这个查询的数据,我使用了 GridView。在我使用的列数组y.b中,依此类推...

我的问题:表 x 中的列显示正确,但是对于表 y 中的每个“连接列”,它都会显示(未设置)。
如果我打印由 ActiveRecord 构建的查询,并在我的 sql 客户端中执行它,它会显示所有数据。
我想这取决于 ModelsprimaryKey()功能,但我无法更改它以使表格正常工作。有人知道我的问题的解决方案吗,或者为什么 dataProvider/GridView 会处理所选模型(在本例中为表 x 模型)primaryKey()方法(或如何使 dataProvider/GridView 忽略primaryKey()?

标签: phpactiverecordgridviewyii2

解决方案


在模型中,您应该使用关系模型创建关系方法。例如:

class Patient extends ActiveRecord
{

    public function getOrders()
    {
        return $this->hasMany(Order::class, ['patient_id' => 'id']);
    }
}

class Order extends ActiveRecord
{
    public function getPatient()
    {
        return $this->hasOne(Patient::class, ['id' => 'patient_id']);
    }
}

对于访问数据:

// SELECT * FROM `patient` WHERE `id` = 1
$patient = Patient::findOne(1);
$orders = $patient->orders;

推荐阅读