Enligt min kunskap, ivrig belastning with
metod kör 2:a frågan. Det är därför du inte kan uppnå vad du vill med ivrig laddning with
metod.
Jag tror att du använder join
metod i kombination med relationsmetod är lösningen. Följande lösning är fullständigt testad och fungerar bra.
// 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();
}
Sedan kan du anropa $user->sortedChannels('desc')
för att få listan över kanaler beställ efter svar created_at
attribut.
För skick som kanaler (som kanske har svar eller inte), använd bara leftJoin
metod.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Redigera:
Om du vill lägga till groupBy
metod för frågan måste du vara särskilt uppmärksam på din orderBy
klausul. För i Sql natur, Group By
klausul körs först före Order By
klausul. Se detaljer om detta problem på denna stackoverflow-fråga
.
Så om du lägger till groupBy
metod måste du använda orderByRaw
metod och bör implementeras enligt följande.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();