質問: お世話になります。 find()メソッドでは、where を使うことで、特定の検索条件を付け加えることができます。 ``` $this->Users->find() ->where(['Users.sex' => 1, 'Users.name LIKE' => '%太郎%']); ``` この場合、Users テーブルの[sex]カラムが[1]と[name]カラムに太郎が含まれる条件が抽出されます。 これが、外部キーを条件にしたときの書き方の一例を頂けたらと思います。 例えば、 Users テーブルには、Article テーブルという記事テーブルと繋がり、さらに Article テーブルは、Tags テーブルという記事のタグ情報と繋がっている場合を想定します。 この場合、ある特定のTags.id と繋がっているUsers.id を引き出すwhere文はどのようになるか知りたいです。以下のコードに続く感じだと思います。 ``` $this->Users->find() ->where ``` 一つのテーブルでのwhereの例は多々ありますが、複数のテーブルでのwhereの解説が欲しいです。 よろしくお願いします。
回答: マニュアル「関連付くデータでフィルタする」にいくつか例がありますよ。 > > Users テーブルには、Article テーブルという記事テーブルと繋がり、さらに Article テーブルは、Tags テーブルという記事のタグ情報と繋がっている場合を想定します。 > > > このように複数階層の関連付けがある場合は、matchingやinnerJoinWithを使えばできると思います。実際に動かしていないですが、以下のようなfindになると思います。 ``` $query = $this-Users->find()->innerJoinWith( 'Articles.Tags', function ($q) { return $q->where(['Tags.name' => 'Hoge']); } ); ``` 実際のSQLはUsersにArticlesをinner joinして、ArticlesをTagsとinner joinしたようなものです。 ※ArticlesとTagsがbelongsToManyの関係なら、中間テーブルもinner joinされる ※マニュアルにも書いてありますが、同じユーザが重複するのでdistinctする必要があると思います。 そのタグを持つ記事を複数書いているユーザがいた場合ですが この部分はマニュアルが充実しているので、よく読むといいですよ!