お世話になります。
以前こちらで、「関連あるテーブルのデータ取得方法」を教えていただきました。
以下のリファレンスを参照することで、
関連付くデータでの取得方法を学びました。
その際に、複数階層があるものは、matching ではなく、innerJoinWith を使うという説明を受けました。複数階層があるという具体例は、以下のようなものを想定しています。
Users テーブルには、Article テーブルという記事テーブルと繋がり、さらに Article テーブルは、Tags テーブルという記事のタグ情報と繋がっている場合を想定します
ただ、参考サイトでは、
cakephp3
1 $query = $products->find()->matching( 2 'Shops.Cities.Countries', function ($q) { 3 return $q->where(['Countries.name' => 'Japan']); 4 } 5 );
matching でも、深い階層を取得しているような気がします。
参考サイトの解説では、
matching() 関数を使うことで、すでに見てきたように、特定の関連との INNER JOIN が作成され、 結果セットにもフィールドがロードされます。
matching() を使いたいものの、結果セットにフィールドをロードしたくない状況もあるかもしれません。 この目的で innerJoinWith() を使うことが出来ます。
という説明され、イメージとしては、matching では、テーブルが全て合体し、例えば以下の場合、
cakephp3
1 $query = $products->find()->matching( 2 'Shops.Cities.Countries', function ($q) { 3 return $q->where(['Countries.name' => 'Japan']); 4 } 5 );
条件によって抽出された日本製品の商品だけでなく、それに付随する[Shops],[Cities],[Countries]も取得できるという意味だと考えています。
逆にinnerJoinWithでは、条件によって抽出された日本製品の情報だけ、この場合、[Products]テーブル内のデータしか取得できないという考察をしました。
しかし、matching は inner join をする、その名前が含まれる innerJoinWith は、inner join はしないというややこしい状態で、私の考えが正しいのかわかりません。
解説をお願いしたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/19 03:18
2016/10/19 03:29
2016/10/19 03:33