Cakephp3でCollectionクラスのfilterメソッドの使う場面と使い方
72 回閲覧されました
みなさんこんにちは、jonioです。
今回はCollectionクラスのfilterメソッドの使う場面と使い方に関してのメモになります。
おすすめ参考書
CakePHP3はまだまだ仕事で使われます。
下記の参考書がおすすめです。
リンク
CakePHPのバージョン
今回は3で解説します。
4にも存在しますがコードの書き方が同じかは分かりません。
filterメソッドとは
Collectionオブジェクト(配列)のデータの中で特定の条件を満たした情報だけを取得します。
使う場面
下記だと思います。
- 元々のデータの条件を絞り込んで使いたい
- 元々のデータとそれを絞り込んだ条件のデータも使いたい
コードで具体的に見ていきます。
具体例(アソシエーションがある場合)
コントローラーに記述します。
use Cake\Collection\Collection;
public function index()
{
$userId = 1;
$this->ModleA = TableRegistry::getTableLocator()->get('ModelA');
$modela = $this->ModelA->get($userId, ['contain' => 'ModelB.ModelC.ModelD']);
$filtered = (new Collection($modela->modelb->modelc))->filter(function ($filter) {
return $filter->modeld->カラムA;
})->first();
}
色々とアソシエーションしていますがこうなってなくてもfilterメソッドは使えるので気にしないで下さい。
9行目の「(new Collection($modela->modelb->modelc))」でmodelcを配列にします。
そしてfilter以降で条件を満たした情報を取得します。
9行目の「$filter」は「modelc」に該当します。
10行目でmodelcに紐づくmodeldのカラムAの値が存在する場合のmodelcの情報の最初の1件目を取得します。
具体例(アソシエーションがない場合)
下記のコードを書いたとします。
$users = [
['name' => 'Alice', 'age' => 18],
['name' => 'Bob', 'age' => 25],
['name' => 'Charlie', 'age' => 30],
];
$adultUsers = (new Collection($users))->filter(function ($user) {
return $user['age'] >= 20;
});
この場合は1行目〜5行目のデータを7行目で条件を満たす情報を取得し8行目で20以上の値のデータに制限しています。
これで取得するデータは「[‘name’ => ‘Alice’, ‘age’ => 18]」・「[‘name’ => ‘Charlie’, ‘age’ => 30]」です。