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();