【问题标题】:limit doesn't work with ActiveRecord限制不适用于 ActiveRecord
【发布时间】:2015-12-03 08:45:52
【问题描述】:

我对使用活动记录的限制有一些问题。

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

【问题讨论】:

    标签: php activerecord yii2


    【解决方案1】:

    首先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])
    

    这样如果以后这个模型相关的表名发生变化,你就不用重构你的代码了。

    【讨论】:

    • 但是 totalcount 是我用来隐藏分页栏的 ActiveDataProvider 的一个属性。在任何地方我都尝试过你的代码并且不起作用。查询仍在重新定位 20 项。
    • @Sageth 我用更详细的解释更正了答案,检查一下。
    • 感谢您给我和想法,我找到了一个非常简单的解决方案:D,检查一下,我想知道您的意见。
    • @Sageth 对不起,我错过了一些东西。再次更正答案,请检查。顺便说一句,您可以将您的解决方案作为答案发布,而不是作为问题的编辑。
    • 在看到你的编辑之前我已经发布了编辑,你的代码更聪明,谢谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多