Laravel bestellt durch eine Beziehung

116

Ich gehe alle Kommentare des Autors eines bestimmten Beitrags durch.

foreach($post->user->comments as $comment)
    {
        echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

Das gibt mir

I love this post (3)
This is a comment (5)
This is the second Comment (3)

Wie würde ich mit der post_id bestellen, damit die obige Liste als 3,3,5 bestellt wird

PrestonDocks
quelle

Antworten:

245

Es ist möglich, die Beziehung mit Abfragefunktionen zu erweitern:

<?php
public function comments()
{
    return $this->hasMany('Comment')->orderBy('column');
}

[nach Kommentar bearbeiten]

<?php
class User
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

class Controller
{
    public function index()
    {
        $column = Input::get('orderBy', 'defaultColumn');
        $comments = User::find(1)->comments()->orderBy($column)->get();

        // use $comments in the template
    }
}

Standardbenutzermodell + einfaches Controller-Beispiel; Wenn Sie die Liste der Kommentare erhalten möchten, wenden Sie einfach orderBy () basierend auf Input :: get () an. (Stellen Sie sicher, dass Sie einige Eingabeprüfungen durchführen;))

Rob Gordijn
quelle
2
Jemand hat dies bereits im Laravel-Forum vorgeschlagen, aber ich möchte dies im Controller tun können, damit ich anhand der Benutzereingaben auswählen kann, welches Feld sortiert werden soll. Vielleicht hätte ich das in der Frage klarer machen sollen.
PrestonDocks
Ich habe ein zweites Beispiel hinzugefügt
Rob Gordijn
1
Danke Rob, du hast mich auf den richtigen Weg gebracht. Die eigentliche Antwort war $ comment = User :: find (10) -> comment () -> orderBy ('post_id') -> get (); Es schien die Methode get () zu benötigen, um zu funktionieren. Wenn Sie Ihrer Antwort get () hinzufügen können, werde ich sie als akzeptierte Antwort markieren.
PrestonDocks
2
Dies funktioniert gut, wenn Sie einen einzelnen Datensatz abrufen
dangel
Wenn Sie den strengen MySQL-Modus verwenden, der in Laravel 5.4, f.ex, standardmäßig verwendet wird, erhalten Sie SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1140 Mischen von GROUP-Spalten ...
Sabine
6

Ich glaube, Sie können auch:

$sortDirection = 'desc';

$user->with(['comments' => function ($query) use ($sortDirection) {
    $query->orderBy('column', $sortDirection);
}]);

Auf diese Weise können Sie eine beliebige Logik für jeden zugehörigen Kommentardatensatz ausführen. Sie könnten Sachen drin haben wie:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);
agm1984
quelle
1
Nee. Ich habe es versucht, es funktioniert nicht. Hier ist mein Fall: Ich habe zwei Tabellen ( appointmentsund schedules), die Abfrage ist einfach: appointmentsBestellung erhalten von schedules. datetimeabsteigend. Ich habe eine Lösung, indem ich eine neue Spalte in die Tabelle einfüge appointments, um sie datetimeaus der Tabelle zu speichern schedules. Und jetzt muss ich nur noch bestellen appointments. datetimeIch weiß, dass es nicht die beste Methode ist, aber es löst das Problem. XD
Fendi Setiawan
Vielen Dank, es hat in meinem Fall funktioniert, es war unglaublich.
Pooria Honarmand