こんにちは、mishimishiです。
GWはどのように過ごされたでしょうか。
私は近鉄線で開催されている「リアル桃鉄で沿線めぐり」というイベントに参加してきました。
近鉄難波駅からスタートし近鉄奈良駅までサイコロを振り、止まって駅で降車するというものでした。
普段降りることのない駅に降りることができ、とても新鮮な体験ができました!
さて、今回は案件が変わってフレームワークも変更になったためCakePHPのfinder機能について
書かせていただきます。
Finderについて
cakePHPには独自のファインダーメソッドを追加する機能があります。
メリットとしては共通で使用するクエリをパッケージ化を行うことができます。
use Cake\ORM\Query;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function findOwnedBy(Query $query, array $options)
{
$user = $options['user'];
return $query->where(['author_id' => $user->id]);
}
}
// コントローラーやテーブルのメソッド内で
$articles = TableRegistry::getTableLocator()->get('Articles');
$query = $articles->find('ownedBy', ['user' => $userEntity]);
finderメソッドでは$optionsを利用することで、finderの操作をカスタマイズすることができます。
またfinderメソッドの中でcontainを使用することでクエリを効率的に生成できます。
// コントローラーやテーブルのメソッド内で
// find() のオプションとして
$query = $articles->find('all', ['contain' => ['Authors', 'Comments']]);
// クエリーオブジェクトのメソッドとして
$query = $articles->find('all');
$query->contain(['Authors', 'Comments']);
上記では関連する author と comment を結果セットの article ごとにロードします。
終わりに
今回はcakePHPでのデータを取得する方法を共有させていただきました。
私自身もcakePHPに触れたばかりなのでわからないことが多いですが、業務を行いながら
知識を蓄えていけたらいいなと思いました。