【问题标题】:yii\db\Query::limit() function not limiting the records - Yii2yii\db\Query::limit() 函数不限制记录 - Yii2
【发布时间】:2016-04-05 21:50:11
【问题描述】:

下面是我用来从表中获取数据以创建 REST api 的代码。

$query = new yii\db\Query();
$sql = $query
    ->select('a.vehicle_number, b.device_id, b.dated, b.speed, b.ignition, b.latitude, b.longitude')
    ->from('tk103_devices a, tk103_current_location b')
    ->where('a.device_id = b.device_id AND a.transporter_id='.$id)
    ->orderBy(['a.vehicle_number'=>SORT_ASC])
    ->limit(1);

$dataProvider = new ActiveDataProvider([
    'query'=>$sql
    ]);
return array('count_flag'=>$countFlag, 'dataProvider'=>$dataProvider->getModels());

我已经按照 Yii 官方文档 http://www.yiiframework.com/doc-2.0/yii-db-querytrait.html#limit()-detail 设置了“设置查询的 LIMIT 部分”的 limit(1)。

当我执行上述查询时,数据提供者正在返回所有记录。

我的代码有什么问题?

【问题讨论】:

    标签: php mysql yii limit


    【解决方案1】:

    ActiveDataProvider 不关心查询限制。

    http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html#active-data-provider

    以上链接摘录:

    注意:如果查询已经指定了 orderBy 子句,则新的 最终用户给出的订购说明(通过排序 配置)将被附加到现有的 orderBy 子句中。任何 现有的限制和抵消条款将被 来自最终用户的分页请求(通过分页 配置)。

    因此,既然您有固定数据,请使用 ArrayDataProvider:

    $data = $query
        ->select('a.vehicle_number, b.device_id, b.dated, b.speed, b.ignition, b.latitude, b.longitude')
        ->from('tk103_devices a, tk103_current_location b')
        ->where('a.device_id = b.device_id AND a.transporter_id='.$id)
        ->orderBy(['a.vehicle_number'=>SORT_ASC])
        ->limit(1)
        ->all();
    
    $dataProvider = new \yii\data\ArrayDataProvider(['allModels' => $data]);
    

    【讨论】:

    • 感谢您抽出宝贵时间来解决我的问题。但是我不能按照Yii doc 的声明使用ArrayDataProvider与yii\data\ActiveDataProvider 相比,ArrayDataProvider 的效率可能较低,因为它需要准备好$allModels。我自己发布了答案并我认为这是我可以使用的更好的版本。不过,我很欣赏你的回答。为此 +1。
    【解决方案2】:

    自己做了一些功课,我通过更改以下代码找到了上述问题的解决方案:

    $query = new yii\db\Query();
    $sql = $query
        ->select('a.vehicle_number, b.device_id, b.dated, b.speed, b.ignition, b.latitude, b.longitude')
        ->from('tk103_devices a, tk103_current_location b')
        ->where('a.device_id = b.device_id AND a.transporter_id='.$id)
        ->orderBy(['a.vehicle_number'=>SORT_ASC])
        ->one();
    
    $dataProvider = new ActiveDataProvider([
        'query'=>$sql
        ]);
    return array('count_flag'=>$countFlag, 'dataProvider'=>$dataProvider);
    

    根据我的情况,我只想检索第一条记录。所以,我使用one() 而不是limit(1)

    其次,我将 dataProvider 返回为 $dataProvider->getModels()。我只将其更改为$dataProvider。由于 “ActiveDataProvider 不注意查询限制。” 根据Fabrizio Caldarelli 在下面(或)上面的回答,它正在返回所有检索到的记录。

    希望对遇到相关问题的人有所帮助。


    要使之前的代码正常工作,您必须在下方(或)上方看到Fabrizio Caldarellianswer

    【讨论】:

    • 但是传递给 ActiveDataProvider 的 'query' 属性的 $sql 是一个 ActiveRecord,而不是 ActiveDataProvider 所需的 ActiveQuery 实例。
    • 我用yii\db\Query扩展了我的模型类
    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多