Mysql
 sql >> Datenbank >  >> RDS >> Mysql

laravel eloquent nach Beziehung sortieren

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