環境:Laravel5.8,MySQL5.7
Laravelでリレーション先のカラムによってソートする方法。
Laravelでデータベースからリレーションを利用してデータを取得して並び替えをする時に、
親ではなく、子の情報で並び替えをしたい時があると思います。
例えば、Twitterの、自分のいいね欄に登録されているツイートの順番は、
ツイートが投稿された順番ではなく、自分がツイートをいいねした順番で並び替えされています。
これは、ツイート(親)に紐づく、Like(子)が作られた時間によって並び替えが行われている状態と考えられます。
ここでは、自分がいいねしたツイートを、いいねをした順番で取得する方法をまとめます。
###条件
Tweet(親)→Like(子)と、
User(親)→Like(子)は、1対多の関係で結びついてるとし、
LikeはTweetのidと、Userのidを含んでいます。
Tweetを取得する際に、Likeのcreated_atをDESCの順で並び替えたいものとします。(新しいいいねが一番上に来る)
$posts = Tweet::select('tweets.*')
->join('likes', 'likes.tweet_id', '=', 'tweets.id')
->where('likes.user_id', Auth::user()->id) //ログインしている自分自身のid
->orderBy('likes.created_at', 'DESC')
->get();
return $posts;