【CakePHP】Finderについて

こんにちは、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に触れたばかりなのでわからないことが多いですが、業務を行いながら

知識を蓄えていけたらいいなと思いました。