CakePHP(v3.x)、findする時containに検索条件を追加する

CakePHPでデータベースの特定のテーブルから情報を取得するときに、contain(“RelatedTable”)を指定すると関連するデータも同時にロードすることができます。 この関連するデータに基づいてfindを実行してやりたい時、containで指定したテーブルに対してmathcing()で値を絞ることができます。

例えば

$target_id = 123;
$Articles->find()->contains(['Comments'])->matching('Comments', function($q) use ($target_id){
            return $q->where(['Comments.id'=>$target_id]);});

のようにArticleテーブルにCommentテーブルを含めてCommentテーブルのidが123と一致する記事を取得することができます。

matching内部では無名関数を用いるので、idをある引数に基づいて取得したいときなどは変数をuse()を使って渡すようにしましょう。