CakePHPでmatchingが何かと基本の使い方とサンプルコード

CakePHPでmatchingが何かと基本の使い方とサンプルコード

90 回閲覧されました

みなさんこんにちは、jonioです。

今回はmatchingメソッドが何かと使い方のメモになります。

おすすめ参考書

CakePHP3はまだまだ仕事で使われます。

下記の参考書がおすすめです。

matchingメソッドとは

関連するモデルに特定の条件を適用し、その条件に一致するprimaryモデルのレコードだけを結果として取得できます。

基本のコード

$this->PrimaryModel->find()->matching('AssociatedModel', function ($q) {
  return $q->where(['AssociatedModel.カラム名' => '条件']);
});

1行目・2行目の「$q」はクエリビルダーオブジェクトです。

AssociatedModelの絞り込みができるようにする物です。

「->matching」以降でAssociatedModelの絞り込みをしてそれに該当するPrimarymodelのデータを取得します。

使用例

PostsとCommentsがアソシエーションをしていたとしてcommentsテーブルのstatusカラムの値がapprovedの時のpostsテーブルのデータを取得します。

$this->Posts->find()->matching('Comments', function ($q) {
  return $q->where(['Comments.status' => 'approved']);
});

少し発展系

使用例ではwhereの条件は1つですが下記のように複数にすることもできます。

$query = $this->Articles->find()->matching('Tags', function ($q) {
  return $q->where([
    'Tags.name' => 'PHP',
    'Tags.created >=' => '2023-01-01'
  ]);
});

$articles = $query->all();

下記のようにcontainを一緒に使うこともできます。

$query = $this->Articles->find()->matching('Tags', function ($q) {
  return $q->where(['Tags.name' => 'PHP']);
})->contain(['Authors']); 

$articles = $query->all();