本記事では、CakePHP4のjoinを利用したサブクエリーの方法を解説しています。
CakePHPでは、サブクエリーの方法が色々とあります。
今回は、モデルを利用したサブクエリーのサンプルを解説いたします。
サンプルの対象データ
サブクエリーで取得するデータは、下記のとおりです。
users
id | name | created | modified |
---|---|---|---|
1 | user1 | 2021-06-01 00:00:00 | 2021-06-02 09:00:03 |
2 | user2 | 2021-06-03 00:00:00 | 2021-06-04 09:00:03 |
3 | user3 | 2021-06-05 00:00:00 | 2021-06-06 09:00:03 |
Hists
id | user_id | content |
---|---|---|
1 | 1 | content_1_1 |
2 | 1 | content_1_2 |
3 | 1 | content_1_3 |
4 | 2 | content_2_1 |
5 | 2 | content_2_2 |
6 | 2 | content_2_3 |
7 | 3 | content_3_1 |
8 | 3 | content_3_2 |
9 | 3 | content_3_3 |
サブクエリーの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//サブクエリー $sub = $this->Hists->find() ->select([ 'Hists.user_id' => 'user.id', ]) ->distinct() ->where([ 'user_id' => $user_id, ] ]); //メインクエリー $main = $this->Users->find() ->contain([ 'Hists', ]) ->join([ 'SubHists' => [ 'table' => $sub, 'type' => 'INNER', 'conditions' => 'Hists.user_id = Users.user_id', ] ]) ->distinct() ->all(); |
Cookbook
Cookbook
関連付くデータを contain() でロードすることもできますが、 追加の join をクエリービルダーに加えることもできます。
引用:Join を追加する