簡體   English   中英

Laravel排序子關系集合

[英]Laravel sort child relationship collection

我有以下3表:
電影
- ID
系列
- ID
-status_id
-movie_id
狀態
- ID
- 訂單號

這是控制器上的代碼:

$movie = Movie::where('slug', $slug)->with(['series'])->first();

這是用於查看的代碼:

@foreach ($movie->series as $series)
  {{ $series->name}}
@endforeach

如何排序$movie->series基於status->order_number 如果它可以寫在模型上,那么每個訂單只寫一次控制器?

有沒有我可以使用例如這樣的代碼:

$movie->series->sortBy('status.order_number');

是的,但是您需要與系列加入狀態:

$movie = Movie::where('slug', $slug)->with([
    'series' => function ($query) {
        // Subquery on `series` table
        return $query
            // select whatever you'll need
            ->select('series.*')
            // join with status
            ->join('status', 'series.status_id', '=', 'status.id')
            // order by order number
            ->orderBy('status.order_number')
            // * you can drop this if you select all the fields you need and use those
            ->with('status');
    },
])->first();

編輯此^方法將在SQL級別上進行排序,但是您也可以使用集合進行此操作:

@foreach ($movie->series->sortBy('status.order_number') as $series)
  {{ $series->name}}
@endforeach

在這種情況下也添加.status到您with避免n + 1個問題: ->with(['series.status'])

您的嘗試不起作用的原因是->sortBy(..)不會對集合進行突變,它只會返回一個新的已排序的集合。 這將工作:

$movie->series = $movie->series->sortBy('status.order_number');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM