Zgodnie z moją wiedzą chętne ładowanie with
metoda uruchom drugie zapytanie. Dlatego nie możesz osiągnąć tego, czego chcesz, przy ładowaniu z chęcią with
metoda.
Myślę, że użyj join
metoda w połączeniu z metodą relacji jest rozwiązaniem. Poniższe rozwiązanie jest w pełni przetestowane i działa dobrze.
// 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();
}
Następnie możesz wywołać $user->sortedChannels('desc')
aby uzyskać listę kanałów zamów według odpowiedzi created_at
atrybut.
Dla warunków takich jak kanały (które mogą mieć odpowiedzi lub nie), po prostu użyj leftJoin
metoda.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Edytuj:
Jeśli chcesz dodać groupBy
metody do zapytania, należy zwrócić szczególną uwagę na swoje orderBy
klauzula. Ponieważ w Sql natura, Group By
klauzula uruchamiana jako pierwsza przed Order By
klauzula. Zobacz szczegóły tego problemu na to pytanie o przepełnienie stosu
.
Więc jeśli dodasz groupBy
metody, musisz użyć orderByRaw
metoda i powinna być zaimplementowana w następujący sposób.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();