Voor zover ik weet, enthousiast with
methode voer de 2e query uit. Daarom kun je niet bereiken wat je wilt met gretig laden with
methode.
Ik denk dat gebruik join
methode in combinatie met relatiemethode is de oplossing. De volgende oplossing is volledig getest en werkt goed.
// 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();
}
Dan kun je $user->sortedChannels('desc')
. aanroepen om de lijst met kanalen te krijgen bestellen door antwoorden created_at
attribuut.
Voor conditie zoals kanalen (die al dan niet antwoorden hebben), gebruik gewoon leftJoin
methode.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Bewerken:
Als u groupBy
. wilt toevoegen methode voor de query, moet u speciale aandacht besteden aan uw orderBy
clausule. Omdat in Sql natuur, Group By
clausule die eerst wordt uitgevoerd vóór Order By
clausule. Bekijk dit probleem in detail op deze stackoverflow-vraag
.
Dus als u groupBy
. toevoegt methode, moet u orderByRaw
. gebruiken methode en moet als volgt worden geïmplementeerd.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();