Cakephp3でCollectionクラスのfilterメソッドの使う場面と使い方

Cakephp3でCollectionクラスのfilterメソッドの使う場面と使い方

121 回閲覧されました

みなさんこんにちは、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]」です。