CakePHPのデータ取得の方法についてまとめました。
そもそもTable/Entityとは
こちらが参考になりました。
https://qiita.com/tatsuo-iriyama/items/87097069013ac9df1ed9
テーブル
データのコレクションにアクセスして、レコードの追加・更新・削除やリレーションの定義のためのオブジェクト
エンティティ
個々のレコードを指す、レコードの振る舞いや機能を定義する
カラムに対しても処理可能
上記を踏まえてCakePHPのデータ取得とは
エンティティを検索したりロードしたりする事を指している。
(データ取得の手段として挙げるメソッドでコレクションとエンティティを返している)
メソッド一覧
参考:
https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html
get
単一のエンティティーを取得する
データが見つからなければ404エラーを返す
この中でカスタムファインダーを使用することも可能
$article = $articles->get($id, [
'finder' => 'translations',
]);
find
ファインダーをロードする
戻り値は常にQueryオブジェクト
実際にクエリが走るのはfind()の実行時ではなく、これの戻り値であるQueryオブジェクトから更に別のメソッドを呼び出す時になる
//クエリは走らない
$query = $articles->find('all');
//クエリが走る
$query = $articles->find('all')
->where(['Articles.created >' => new DateTime('-10 days')])
->contain(['Comments', 'Authors'])
->limit(10);
クエリが走る=クエリービルダーインターフェイスを使用する事ができる
これでより複雑なクエリを構築できる。
クエリービルダーインターフェイスを呼び出した後の戻り値はエンティティーになる。
オプション一覧
conditions クエリーの WHERE 句に使う条件を提供します。
limit 欲しい行数をセットします。
offset 欲しいページオフセットをセットします。 page をあわせて使うことで計算を簡単にできます。
contain 関連をイーガーロード (eager load) するように定義します。
fields エンティティーへとロードされる列を制限します。いくつかの列だけがロードされることになるので エンティティーが正しく動かないこともありえます。
group クエリーに GROUP BY 句を加えます。集約関数を使う際に便利です。
having クエリーに HAVING 句を加えます。
join カスタム JOIN を追加で定義します。
order 結果セットに並び順を設定します。
ここに無いオプションを使用した場合、beforeFind リスナに渡されオブジェクトの変更が行われる。
また、クエリーオブジェクトの getOptions()で、利用中のオプションを取得する事ができる。らしい
(利用中のオプション、という記載が公式にあったけど利用中が何を指すのかわからない、、)
クエリーオブジェクトをコントローラーに渡すより、カスタムファインダーメソッドを使用する事がおすすめと公式より。
カスタムファインダーメソッドについては別の記事にした方が良さそうだけど、クエリービルダーインターフェイスのメソッドは下記など、、
first()
count()
list()
setDisplayField()
他多数
まとめ
以上、データ取得のための方法はget・findが主ですが、特にfindは戻り値のクエリーオブジェクトの方でかなりたくさんのメソッドが存在するようなので、実際に使うにはそちらも整理しないとと感じました。