yii \ db \ Query :: limit()函数不限制记录 - Yii2

时间:2016-04-05 12:11:24

标签: php mysql yii limit

下面是我用来从我的表中获取数据以创建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设置了限制(1)“设置查询的LIMIT部分。”。

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

我的代码出了什么问题?

2 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:0)

我自己完成了一些功课,通过更改下面的代码找到了解决上述问题的方法:

$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