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

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.