2011-06-26 10 views
0

CDbCriteriaでCActiveDataProviderを使用して、関連する複数のモデルを使用していくつかの関連するモデルを検索しています。結果を生成するコードは以下の通りです:Yiiフレームワーク:不正確な結果の数を報告するClistview

$criteria->select = '*, (3959 * acos(cos(radians(' . $latitude . ')) 
* cos(radians(latitude)) * cos(radians(longitude) - 
radians(' . $longitude . ')) + sin(radians(' . $latitude . ')) 
* sin(radians(latitude)))) * 1.609344 AS distance'; 
//Basically just calculating distance from an input point 
$criteria->with = array('keywords', 'coupons', 'jobs'); 
$criteria->order = 'distance asc'; 
$criteria->having = 'distance < 20'; 
$criteria->compare('name', $this->searchTerm, true, 'AND'); 

$のdataProvider =新しいCActiveDataProvider( '店'、配列( '基準' => $基準));

検索が正常に動作し、期待どおりの結果が得られます。問題は、CListviewが結果の数を正しく報告するが、とにかくページ分割を示すことである。たとえば、「31の結果のうちの1〜7を表示し、ページ番号が表示されます。 2、3、4ページをクリックすると結果が表示されません。

これはバグですか、何か間違っていますか?

答えて

1

時々、複雑なクエリでは、手動でアイテム数と行数を提供する必要があり、同様に属性を使用してデータプロバイダとの数を渡してみてください。

'totalItemCount'=>$count, 

http://www.yiiframework.com/doc/api/1.1/CDataProvider#totalItemCount-detail

+0

これは有望に思えます。これは、CDataProviderにフィードするためのクエリからレコードの総数を取得するのに適していますか? –

+0

ここで、ハックな解決策を得ました:http://pastebin.com/ZUAHBm3P。あなたは一見を持ち、より良い方法を提案できますか? –

0

私はしましたGROUP BY句を含むクエリを使用しようとしたときに、レコードとレコードの実際のリストの間に同様の不一致がありました。私はあなたの質問にHAVING句があることに気付きました。私はこれが同様の問題を引き起こす可能性があり、Yiiのソースhereを見ると、GROUP BY句またはHAVING句のいずれかが存在すると、これらの句が1つも指定されていない場合とは異なる処理が行われることがわかります。

計算された列を使用できるように$criteria->havingを使用したようです。distanceこれが問題であれば簡単なテストではなく$criteria->conditionを使用して、このような完全な計算と同等に設定することです:

$criteria->condition = '(3959 * acos(cos(radians(' . $latitude . ')) 
* cos(radians(latitude)) * cos(radians(longitude) - 
radians(' . $longitude . ')) + sin(radians(' . $latitude . ')) 
* sin(radians(latitude)))) * 1.609344 < 20'; 

conditionプロパティは、カウントの問題が起こらないWHERE句を生成するために使用されますHAVINGのように。

ところで、Yiiが行っている実際のクエリを検査できることは非常に便利です。それは驚くべきことであり、問​​題や非効率を示すことがあります。あなたの保護/設定/ main.phpでこれを設定することにより、出力にすべてのウェブページの下部にあるクエリ情報をYiiのを取得することができます:

'components'=>array(
    'db'=>array(
     // DB connection info as usual 
    ), 
    'log'=>array(
     'routes'=>array(
      array(
       'class'=>'CWebLogRoute', 
       'levels'=>'trace', 
      ), 
     ), 
    ), 
), 
1

$criteria->with = array('keywords', 'coupons', 'jobs'); 

と見ている場合は、この行をコメントアウトしてみページャとアイテム数が正しく応答します。私はこれが私の場合であることが判明したので、パフォーマンスヒットをして、怠惰な負荷をかけなければなりません。

0

これを修正するにはCActiveFinderでCJoinElementをハックする必要がありました。 CJoinElementのcount関数は、要約の合計数を表示する実際の作業を行う関数です。これにより、グループがリセットされ、基準のコンポーネントがリセットされます。リセットを解除すると問題が解決しました。 https://github.com/yiisoft/yii/issues/167

関連する問題