私の知る限り、熱心な負荷 with
メソッドは2番目のクエリを実行します。そのため、積極的な読み込みでは目的を達成できません。 with
メソッド。
join
を使うと思います 関係方法と組み合わせた方法 解決策です。次のソリューションは完全にテストされており、正常に機能します。
// In User Model
public function channels()
{
return $this->belongsToMany('App\Channel', 'channel_user')
->withPivot('is_approved');
}
public function sortedChannels($orderBy)
{
return $this->channels()
->join('replies', 'replies.channel_id', '=', 'channel.id')
->orderBy('replies.created_at', $orderBy)
->get();
}
次に、$user->sortedChannels('desc')
を呼び出すことができます チャネルのリストを取得するには 返信による注文created_at
属性。
チャネルのような状態の場合 (返信がある場合とない場合があります)、leftJoin
を使用してください メソッド。
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
編集:
groupBy
を追加する場合 クエリのメソッドでは、orderBy
に特別な注意を払う必要があります 句。 SQL 性質、Group By
句はOrder By
の前に最初に実行されます 句。この問題の詳細については、このstackoverflowの質問
。
したがって、groupBy
を追加すると メソッドでは、orderByRaw
を使用する必要があります メソッドであり、次のように実装する必要があります。
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();