限制不适用于ActiveRecord

时间:2015-12-03 08:45:52

标签: php activerecord yii2

我使用有效记录时遇到了一些限制问题。

我创建了一个限制为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个。

1 个答案:

答案 0 :(得分:2)

首先totalCountPagination的属性,而不是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])

这样,如果将来更改此模型相关的表名,您就不必重构代码。