関連するテーブルを検索条件としてデータを取得する 【CakePHP4】

CakePHPは非常に便利ですが、データの取得方法に迷うことがあります。

今回は、リレーションしているテーブルの情報をもとにデータを取得する方法を紹介します。

Containしているデータの情報を使って検索

$editorsTable = TableRegistry::getTableLocator()->get('Editors');
$editorsTable
->find()
->contain(['Articles'])
->matching('Articles', function($q){
        return $q->where(['Articles.Category_id'=>1]);
    }
  )
->order(['Articles.PublishDate' => 'DESC'])
->first();

検索条件に変数を使いたい場合

直前の例では検索に利用する値が数値(1)でしたが、$numberのように変数を利用したい場合もあります。

その場合は下記のように取得できます。

->matching('Articles', function($q) use ($number){
        return $q->where(['Articles.Category_id'=>$number]);
     }
  )

AND検索、OR検索

AND検索

->maching()の部分を繰り返せばAND検索になります。

下記の例ではカテゴリーIDが1、かつタグIDが1

->matching('Articles', function($q){
        return $q->where(['Articles.Category_id'=>1]);
    }
  )
->matching('Articles', function($q){
        return $q->where(['Articles.Tag_id'=>1]);
    }
  )

OR検索の場合

下記のようにします。

->matching('Articles', function($q){
        return $q->where([
               OR' => [
                             ['Articles.Category_id'=>1],
                             ['Articles.Tag_id'=>1],
                ],
            ]);
       }
 );

参考

CakePHP 4.x Strawberry Cookbook 『データの取り出しと結果セット』

コメント

タイトルとURLをコピーしました