我使用有效记录时遇到了一些限制问题。
我创建了一个限制为5的dataProvider:
$dataProvider = new ActiveDataProvider([
'query' => Devicesdb::find()
->joinWith('score')
->where('devices.devicetype = :deviceType', [':deviceType' => $device])
->orderBy(['score' => SORT_DESC])
->limit(5),
'totalCount' => 5,
]);
这是调试面板中的结果查询:
SELECT `devicesdb`.*
FROM `devicesdb`
LEFT JOIN `devices`
ON `devicesdb`.`id` = `devices`.`id`
WHERE devices.devicetype = 'phone'
ORDER BY `score`
DESC LIMIT 20
查询很好,并按我想要的方式返回数据,但我只需要5个项目,而不是20个。
答案 0 :(得分:2)
首先totalCount
是Pagination的属性,而不是ActiveDataProvider。您需要将其嵌套在分页配置数组中。但这不是你实现这一目标的方式。
因为您不希望显示分页,所以您可以通过传递false
来禁用分页,现在将从查询中获取限制(否则会被忽略并以不同方式计算,您可以看到this related question):
$dataProvider = new ActiveDataProvider([
'query' => Devicesdb::find()
->joinWith('score')
->where('devices.devicetype = :deviceType', [':deviceType' => $device])
->orderBy(['score' => SORT_DESC])
->limit(5),
'pagination' => false,
]);
]);
还有一件事 - 您不必手动编写参数,请参阅this question以获得解释和更好的理解。因此where
部分查询可以简化为:
->where(['devices.devicetype' => $device])
另外,我建议将模型名称重构为Device
,并使用它来解决SQL查询中的重复名称冲突(如果有):
->where(Device::tableName() . 'devicetype' => $device])
这样,如果将来更改此模型相关的表名,您就不必重构代码。