【Laravel】リレーション先のテーブルでソートする
リレーション先のレコード数でソートしたい
withCount('リレーション名')
で取得してリレーション名_count
を指定する。
例)コメントの多い順
Post::withCount('comments')
->orderBy('comments_count', 'desc')
リレーション先のカラムでソートしたい
withCount()
のような良い感じの関数がなく、joinしてあげる必要あり。
例)古参ユーザーが投稿した順
Post::select(['posts.*', 'users.created_at'])
->join('users', 'users.id', '=', 'posts.user_id')
->orderBy('users.created_at')
※selectは必要なければ指定不要
テーブル名はモデル内に隠蔽しておきたい場合は Post::make()->getTable()
で取得できる。※参考
例)古参ユーザーが投稿した順(テーブル名ベタ書きは嫌)
Post::join(
User::make()->getTable(),
User::make()->getTable().'.id', '=', Post::make()->getTable().'.user_id'
)
->orderBy(User::make()->getTable().'.created_at')
うーん、、
withColumn('user', 'created_at')
のような関数あればいいのにな。
中間テーブルのカラムでソートしたい
withPivot
を使う。
** とある投稿のいいねしたユーザー一覧(いいねした順)**
class Post extends Model
{
public function likeUsers()
{
// エイリアス指定しないとpivot_created_atになるので、わかりやすい名前をつけるのおすすめ
return $this->belongsToMany('User', 'post_user_like')->withPivot('created_at as like_at');
}
}
$post->likeUsers()->orderBy('like_at');