yiidbQuery::limit()函数不限制记录-Yii2


yiidbQuery::limit() function not limiting the records - Yii2

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

$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官方文档,我设置了限制(1),即"设置查询的limit部分。"http://www.yiiframework.com/doc-2.0/yii-db-querytrait.html#limit()-细节。

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

我的代码出了什么问题?

ActiveDataProvider不关心查询限制。

http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html#active-数据提供商

摘录自以上链接:

注意:如果查询已经指定了orderBy子句,则新的最终用户给出的订购说明(通过排序configuration)将附加到现有的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]);

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

$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 Caldarelli的回答。