下面是我用来从表中获取数据以创建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的回答。