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为了更好地理解,我根据您的情况更新了答案。希望这有帮助。