Dle mých znalostí chtivá zátěž with
metoda spustit 2. dotaz. To je důvod, proč nemůžete dosáhnout toho, co chcete, pomocí horlivého načítání with
metoda.
Myslím, že použijte join
metoda v kombinaci s metodou vztahu je řešení. Následující řešení je plně otestováno a funguje dobře.
// 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();
}
Poté můžete zavolat $user->sortedChannels('desc')
zobrazí se seznam kanálů seřadit podle odpovědí created_at
atribut.
Pro podmínky, jako jsou kanály (které mohou nebo nemusí mít odpovědi), stačí použít leftJoin
metoda.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Upravit:
Pokud chcete přidat groupBy
metodou na dotaz, musíte věnovat zvláštní pozornost vašemu orderBy
doložka. Protože v Sql příroda, Group By
klauzule spusťte jako první před Order By
doložka. Podrobnosti o tomto problému najdete na tato otázka přetečení zásobníku
.
Pokud tedy přidáte groupBy
musíte použít orderByRaw
a měl by být implementován jako následující.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();