Efter min viden, ivrig belastning with
metode køre 2. forespørgsel. Derfor kan du ikke opnå det, du ønsker, med ivrig loading with
metode.
Jeg tror, du bruger join
metode i kombination med relationsmetode er løsningen. Følgende løsning er fuldt testet og fungerer godt.
// 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();
}
Så kan du kalde $user->sortedChannels('desc')
for at få listen over kanaler sorter efter svar created_at
attribut.
Til tilstand som kanaler (som muligvis har svar eller ikke), brug bare leftJoin
metode.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Rediger:
Hvis du vil tilføje groupBy
metode til forespørgslen, skal du være særlig opmærksom på din orderBy
klausul. Fordi i Sql natur, Group By
klausul køres først før Order By
klausul. Se detaljer om dette problem på dette stackoverflow-spørgsmål
.
Så hvis du tilføjer groupBy
metode, skal du bruge orderByRaw
metode og bør implementeres som følgende.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();