Php 添加显示同一组gridview yii2下记录计数的列

Php 添加显示同一组gridview yii2下记录计数的列,php,mysql,gridview,yii2,Php,Mysql,Gridview,Yii2,我试图在表中计算同一组的记录。我知道通过查询很容易做到这一点,是的,我已经做到了,但我正在考虑将计数放在主要模型和搜索模型上的正确方法 数据库如下所示: Device ---------------------------- id name group_id 1 Phone Sony 2 2 Computer 1 3 Printer 1 4 Phone LG 1 Group

我试图在表中计算同一组的记录。我知道通过查询很容易做到这一点,是的,我已经做到了,但我正在考虑将计数放在主要模型和搜索模型上的正确方法

数据库如下所示:

Device
----------------------------
id    name          group_id
1    Phone Sony        2
2    Computer          1
3    Printer           1
4    Phone LG          1


Group
----------------------------
id    name          
1    Home
2    Office
输出表:

Group Name   Device Count
  Home           1
  Office         3
我通过在控制器上执行查询来实现这一点

SELECT COUNT( * ) 
FROM  `hosts` 
WHERE group_id = *~DESIRED NUMBER HERE~*
我正在寻找更好的方法。我是SQL新手,我认为连接表是正确的方法,但我仍然不是很确定

GroupSearch
model下,我将添加以下内容:

$dataProvider->setSort(['attributes' => [
            'devicecount' => [
                 'asc' => [ 'devicecount' => SORT_ASC ],
                 'desc' => [ 'devicecount' => SORT_DESC ],
            ],
        ]
 ]);

由于
devicecount
在表中不可用,因此将显示错误。我应该把同一个店铺id的计数放在哪里?在
设备
型号下还是在
型号下?我怎样才能对它们进行排序呢?

这里有一个例子可以说明如何处理这种情况

模型示例:

class Group extends \yii\db\ActiveRecord
{
    public $devicesCount;

    // ...

    public function getDevices()
    {
        return $this->hasMany(Device::className(), ['group_id' => 'id']);
    }
}
查询示例:

$customers = Group::find()
    ->select([
        '{{group}}.*', // select all customer fields
        'COUNT({{device}}.id) AS ordersCount' // calculate orders count
    ])
    ->joinWith('devices') // ensure table junction
    ->groupBy('{{group}}.id') // group the result to ensure aggregation function works
    ->all();
其中
{{group}}
{{device}
-组和设备的相应表名,或者您可以使用
group::tableName()
device::tableName()
更好地维护代码


然后,由于您添加了count as model属性,您将能够按此列对结果进行排序。

谢谢!我真的很抱歉,但是我很难理解你的答案。你的桌子怎么样?您将查询放在哪里?我如何添加
->where(*some condition*)
?@Gibs此示例取自文档。根据您的情况进行纠正。您可以将其添加为
->和
->all()
调用之前的where()
。@Gibs为了更好地理解,我根据您的情况更新了答案。希望这有帮助。