2016-04-05 26 views
0

以下は、REST APIを作成するためのテーブルからデータを取得するためのコードです。私が行うリミット(1)設定していた "クエリのLIMITの一部を設定しますを。" Yiiの公式ドキュメントhttp://www.yiiframework.com/doc-2.0/yii-db-querytrait.html#limit()-detailあたりとしてレコードを制限しないyii db Query :: limit()関数 - Yii2

$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()); 

上記のクエリを実行すると、すべてのレコードがdataproviderによって返されています。

私のコードで何が問題になっていますか?

答えて

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); 

私のシナリオによると、私は最初のレコードだけを取得したかったのです。だから、limit(1)の代わりにone()を使用しました。

第2に、dataProviderを$dataProvider->getModels()として返していました。これを$dataProviderに変更しました。 以降 "ActiveDataProviderはクエリ制限に注意しません。"Fabrizio Caldarelliの下の(または)上記の回答で検索したすべてのレコードを返していました。

誰かが関連する問題を抱えているのを助けることを望みます。前のコードが機能するためには


、あなたは Fabrizio Caldarellianswer以下(または)上記を参照しなければなりません。

+0

しかし、ActiveDataProviderの 'query'属性に渡された$ sqlはActiveRecordであり、ActiveQueryのインスタンスではなく、ActiveDataProviderに必要です。 –

+0

モデルクラスを 'yii \ db \ Query'で拡張しました。 – Choxx

1

ActiveDataProviderはクエリの制限に注意しません。上記のリンクから

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

エキス:

注:クエリがすでにORDERBY句を指定した場合、(ソート 設定を通して)、エンドユーザーによって与えられた新しい 発注命令が追加されます既存のorderBy節に追加します。 既存のlimit句とoffset句は、エンドユーザの ページネージング要求(ページ番号 の設定)によって上書きされます。だから、

、あなたがデータを固定しているため、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]); 
+0

問題をお寄せいただきありがとうございます。しかし、私は[Yii doc](http://www.yiiframework.com/doc-2.0/yii-data-arraydataprovider.html)の記述、** yii \ data \ ActiveDataProviderと比較して、 'ArrayDataProvider'を使用することはできません。 ArrayDataProviderは、$ allModelsを準備する必要があるため、効率が悪くなる可能性があります。**自分で回答を投稿しました。しかし、私はあなたの答えに感謝します。それに対して+1。 – Choxx

関連する問題