下面是我用来从我的表中获取数据以创建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部分。”。
当我执行上述查询时,数据提供者将返回所有记录。
我的代码出了什么问题?
答案 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 Caldarelli的answer。