2016-12-02 10 views
0

私は次のコードを持っている:CakePHP3:結果がコレクションの場合、クエリ結果のカウントを取得する方法は?

$sites = $this->Sites->find() 
->contain([ 
    'Sitecategories', 
    'Sitedescriptions.Languages', 
    'Countries', 
    'Users' 
]) 
->where([ 
    'postcode LIKE' => $this->request->data['numero'] . '%' 
]) 
->sortBy(function($row) { return substr($row->postcode, 0, 2); }, SORT_ASC); 

デバッグ($サイト)。表示:

object(Cake\Collection\Iterator\SortIterator) { 

'count' => (int) 428 

} 

しかし、私はそのカウントvarにアクセスする方法を理解していません。

私は$sites->count()にアクセスしようとしましたが、私は次のようなエラーメッセージが出ます:あなたはcount($sites->toArray())を使用する必要が

Error: You cannot issue a count on a Collection. 

答えて

1

カウントコレクションは、反復処理中に突然変異する可能性があるため、数や内容が変更される可能性があるため、一定の信頼性が低く、反復処理ごとに変更が再適用される可能性があり、 (フィルタリング、縮小、含まれているオブジェクトの変更など)。もう1つの望ましくない効果は、回収不能なコレクションである可能性があります。つまり、それらをもう一度反復することはできません。基本的にcountメソッドは実装されていません

戻り値はiterator_count()であり、トラバース可能なオブジェクトを受け取り、イテレータの要素数を返します。これを呼び出すと前述の副作用が発生し、コレクションが反復され、おそらく突然変異が起こります。あなたが本当に数を知っているし、コレクションを維持したいために必要がある場合は

、あなたは例えばのように、適用されるすべての修正を加えたソースデータに基づいて新しいコレクションを作成することを、事前にそれをコンパイルすることができます:

$sitesは、この時点以降は安全に再使用できます。

あなたはもうコレクションを必要としない場合は、常に単純に配列に変換して、それを数えることができる:

$sites = $sites->toArray(); 
$count = count($sites); 

+0

わかりました、それはたくさんあります。 – 2ndGAB

0

を。

0

バッファ可能なイテレータを使用することもできます。

$collection = new Collection([1,2,3]); 
$collection->count(); //throws exception 
$collection->buffered()->count(); //gives 3 
関連する問題