Според моите познания, ви нетърпелив товар 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();