Meines Wissens eifrige Ladung with
Methode 2. Abfrage ausführen. Deshalb kann man mit eifrigem Laden nicht das erreichen, was man will with
Methode.
Ich denke, verwenden Sie join
Methode in Kombination mit der Beziehungsmethode ist die Lösung. Die folgende Lösung wurde vollständig getestet und funktioniert gut.
// 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();
}
Dann können Sie $user->sortedChannels('desc')
aufrufen um die Liste der Kanäle zu erhalten Sortieren nach Antworten created_at
Attribut.
Für Bedingungen wie Kanäle (die möglicherweise Antworten haben oder nicht), verwenden Sie einfach leftJoin
Methode.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Bearbeiten:
Wenn Sie groupBy
hinzufügen möchten Methode zur Abfrage müssen Sie besonders auf Ihre orderBy
achten Klausel. Denn in SQL Natur, Group By
-Klausel zuerst vor Order By
ausgeführt Klausel. Einzelheiten zu diesem Problem finden Sie unter diese Stackoverflow-Frage
.
Wenn Sie also groupBy
hinzufügen Methode müssen Sie orderByRaw
verwenden Methode und sollte wie folgt implementiert werden.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();