Cakephpにはデータベースから値を取得するために、find()
を中心に、たくさんの便利な機能があります。
先日、データを自由に取得するために、Cakephpの機能の一つとして「カスタムファインダー」を利用する機会がありました。
始めてではないにしろ、「どうやって作成するか」は完全に忘れていたので、指南をもらっていた上に、カスタムファインダの定義場所を間違え、躓いていました(テヘ)
結果的に冷静に指南を読めば良かったものの、ざっと読んで行動に移した自分を戒めるために、放課後居残りでブログの刑に罰せられる流れになります。
カスタムファインダーが必要になった背景
まず、カスタムファインダーが必要になった背景ですが、アソシエーションを定義していて、Cake2の時に存在していた「fields」(取得するフィールドを予め指定。よって不要なフィールドは取得せずに済む)がお亡くなりになってるんですね。(なぜなくした?)
で、Cake4で、アソシエーションモデルに取得したいフィールドを指定するために、「カスタムファインダー」を利用する必要がありました。(まあ、ぶっちゃけなくてもできるけど、コードが冗長になったりするんですよね・・)
もちろん、カスタムファインダーはアソシエーションにおいてフィールドを指定したい時にだけあるのではなく、予め、用意されているfind()をカスタマイズすることができ、データをあなたの期待する形でごにょごにょした後に取り出してくれる優れものです。(と、いいつつ自分使い慣れてないやんけw)
ステップごとにカスタムファインダーを定義
それでは、ステップごとにカスタムファインダーを定義して、アソシエーションにフィールドを指定してみましょう。
step
1アソシエーションを定義する
まず、該当のモデルのテーブルファイルにアソシエーションを貼ります。
// initialize 内で定義 $this->belongsTo('Hoges', ['finder' => 'selectId']);
ここではテキトーにHogesモデルをbelongsToし、カスタムファインダーを指定しました。(ファインダー名はselectId)
step
2HogesTableにカスタムファインダのメソッドを定義
次に「HogesTable」にカスタムファインダーメソッドを定義します。(※ここ重要です)
アソシエーションを貼ったモデルテーブルではなく、対象のモデル(Hoges)にカスタムファインダーを定義します。
※HogesTable.phpに定義!!
public function findSelectId(Query $query, array $options) { return $query->select(['id']); }
これで、Hogesを呼んだ時に、selectされるのはidだけになります。
命名規則的な解説
- カスタムファインダーメソッドは接頭辞にfindをつけ、アッパーキャメルケースで名前をつける
- finder指定の時は、findなしのバックキャメルケースで指定する
最後に
アソシエーションで指定するカスタムファインダーは「アソシエーションされる側のモデルに定義する」というのがミソですね。
カスタムファインダーは基本的に「自分のモデルをゴニョゴニョする」という定義なので、アソシエーションする側は「それをお借りする」というイメージです。
自己で自己を定義することで独立性と再利用性も高まります(むしろこちらが大事)。
引用元: 師匠(おにいちゃん)
■ Cakephp4: カスタムFinderメソッド
https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html#custom-find-methods