CakePHPでmatchingが何かと基本の使い方とサンプルコード
61 回閲覧されました
みなさんこんにちは、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();