Ordine di Laravel per una relazione


116

Sto ripetendo tutti i commenti pubblicati dall'autore di un particolare post.

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

Questo mi dà

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

Come dovrei ordinare in base a post_id in modo che l'elenco sopra sia ordinato come 3,3,5

Risposte:


247

È possibile estendere la relazione con le funzioni di query:

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

[modifica dopo il commento]

<?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
    }
}

modello utente predefinito + semplice esempio di controller; quando si ottiene l'elenco dei commenti, applicare semplicemente orderBy () in base a Input :: get (). (assicurati di fare un po 'di controllo degli input;))


2
Qualcuno lo ha già suggerito nel forum Laravel, ma voglio essere in grado di farlo nel controller in modo da poter scegliere quale campo ordinare in base all'input dell'utente. Forse avrei dovuto renderlo più chiaro nella domanda.
Preston Dock,

Ho aggiunto un secondo esempio
Rob Gordijn

1
Grazie Rob, mi hai messo sulla strada giusta. La risposta effettiva è stata $ comments = User :: find (10) -> comments () -> orderBy ('post_id') -> get (); Sembrava aver bisogno del metodo get () per funzionare. Se puoi aggiungere get () alla tua risposta, la contrassegnerò come risposta accettata.
Preston Dock il

2
Funziona bene se stai recuperando un singolo record, ma se stai recuperando più record vorrai qualcosa di più sulla falsariga di stackoverflow.com/a/26130907/1494454
dangel

Se utilizzi la modalità rigorosa di mysql, che è predefinita in Laravel 5.4, f.ex riceverai SQLSTATE [42000]: Errore di sintassi o violazione di accesso: 1140 Miscelazione di colonne GROUP ...
Sabine

8

Credo che tu possa fare anche:

$sortDirection = 'desc';

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

Ciò consente di eseguire una logica arbitraria su ogni record di commento correlato. Potresti avere cose come:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);

1
No. L'ho provato, non funziona. Ecco il mio caso: ho due tabelle ( appointmentse schedules), la query è semplice: getappointments ordine per schedules. datetimediscendente. Ho una soluzione aggiungendo una nuova colonna nella tabella appointmentsper memorizzare datetimedalla tabella schedules. E ora devo solo ordinare entro appointments. datetimeSo che non è il metodo migliore, ma risolve il problema. XD
Fendi Setiawan

Grazie mille, ha funzionato nel mio caso, è stato fantastico.
Pooria Honarmand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.