【问题标题】:Yii2 GridView shows "(not set)" if dataProvider contains GROUP BY and INNER JOIN如果 dataProvider 包含 GROUP BY 和 INNER JOIN,Yii2 GridView 显示“(未设置)”
【发布时间】:2020-01-20 16:43:17
【问题描述】:

我已经显示(仅显示,不完整的 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

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

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

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

【问题讨论】:

  • ActiveRecord 要求 relationName.property/columnName 打印相关数据,而不是连接中使用的表别名。
  • 问题是,连接的表甚至没有出现在 $dataProvider 中
  • 请显示实际代码(您是如何构建此查询的)-您的抽象示例隐藏了实际问题。

标签: php activerecord gridview yii2


【解决方案1】:

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

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;

【讨论】:

  • 这不是问题,正如我所提到的,我已经这样做了,并且连接本身工作正常。当我在我的 searchModel 中打印查询并在 sql 中执行它时,我得到了正确的结果。
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多