こんにちは、おーしまです。
今回は、whereInを使ってサブクエリしていきたいと思います。
今回は3つのテーブルがあり
usersテーブル(多) → (一)articlesテーブル(多) → (一)commentsテーブル
のような関係性があるとします。
また、articlesテーブルには、user_id
commentsテーブルには、article_id
の外部キーがあります。
この時、「ユーザーの投稿した記事のコメントを全て取得したい」として
user_idのみ与えられたとします。
今までなら、
<?php $user = User::find($user_id); $comments = []; foreach($user->articles as $article) { foreach($new->comments as $comment){ array_push($comments, $comment) } } ?>
とやっていましたが、
whereInを使うと、、、
<?php $select = Comment::select(); $select ->whereIn('article_id', function ($query) use ($user_id) { $query->from('articles') ->select('id') ->where('user_id','=',$user_id) }); ?>
で取り出すことができました。
こうすることで処理の数が少なくなり、優れています。
whereInで、テーブルを超えてidが一致するものだけ取得できるので、、
今回で言うと、commentsテーブルのarticle_idとidが一致するものを選び、
articlesテーブルのuser_idと最初に与えられた$user_idが一致するものを取ってきています。
今回はここまでです。
それでは、また。