【Laravel】リレーション先のカラムや合計値を対象にソートする

えび

Laravelにてリレーション先のテーブルを対象にorderByをかけたかった

リレーション先のテーブルのカラムでorderByする

例えば、記事テーブル (posts) があってそれに紐づくカテゴリテーブル (categories) のsortカラムでソートをかけたい場合

IDnamesort
1カテゴリA1
2カテゴリB2
categoriesテーブル

IDcategory_idtitle
12記事タイトル1
21記事タイトル2
postsテーブル

  • app/Models/Production にはリレーション指定をしておく
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Post extends Model
{
    use HasFactory;

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }
}
  • そして取得部分のソース
    withの中でorderByするとOK
Post::with(['category' => function ($query){
  $query->orderBy('sort');
}])->get();

2階層目のリレーションを対象にする場合

  • 例えば記事を投稿したユーザー (users)をベースで取得する場合はこんな感じ
    usersテーブルにはpostリレーションが貼ってあることが前提
User::with(['post.category' => function ($query){
  $query->orderBy('sort');
}])->get();

リレーション先のカラムの合計値でソートする場合

  • 例えばユーザー (users)をベースとして、かつ紐づく投稿 (posts)を見た人 (posts.view_count) の合計数でソートしたい場合
User::withCount([
        'posts AS total_view_count' => function ($query) {
          $query->select(DB::raw("SUM(view_count) as view_count_sum"));
         }
      ])->orderBy('total_view_count', 'desc')
      ->get();

\ 案件のご依頼・ご相談はこちらから /