Orden de Laravel por una relación


116

Estoy revisando todos los comentarios publicados por el autor de una publicación en particular.

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

Esto me da

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

¿Cómo ordenaría por post_id para que la lista anterior se ordene como 3,3,5

Respuestas:


247

Es posible extender la relación con funciones de consulta:

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

[editar después del comentario]

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

modelo de usuario predeterminado + ejemplo de controlador simple; cuando obtenga la lista de comentarios, simplemente aplique el orderBy () basado en Input :: get (). (asegúrese de hacer algunas comprobaciones de entrada;))


2
Alguien ya sugirió esto en el Foro de Laravel, pero quiero poder hacer esto en el Controlador para poder elegir qué campo ordenar según la entrada del usuario. Quizás debería haber aclarado esto en la pregunta.
PrestonDocks


1
Gracias Rob, me pusiste en el camino correcto. La respuesta real fue $ comentarios = Usuario :: buscar (10) -> comentarios () -> orderBy ('post_id') -> get (); Parecía necesitar el método get () para funcionar. Si puede agregar get () a su respuesta, la marcaré como la respuesta aceptada.
PrestonDocks

2
Esto funciona bien si está recuperando un solo registro, pero si está recuperando varios registros, querrá algo más
similar a

Si usa el modo estricto de mysql, que es el predeterminado en Laravel 5.4, por ejemplo, recibirá SQLSTATE [42000]: Error de sintaxis o violación de acceso: 1140 Mezcla de columnas de GRUPO ...
Sabine

8

Creo que también puedes hacer:

$sortDirection = 'desc';

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

Eso le permite ejecutar lógica arbitraria en cada registro de comentario relacionado. Podrías tener cosas allí como:

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

1
¡No! He probado esto, no funciona. Este es mi caso: tengo dos tablas ( appointmentsy schedules), la consulta es simple: obtener el appointmentspedido schedules. datetimedescendente. Tengo una solución agregando una nueva columna en la tabla appointmentspara almacenar datetimedesde la tabla schedules. Y ahora solo necesito ordenar por appointments. datetimeSé que no es el mejor método, pero resuelve el problema. XD
Fendi Setiawan

Muchas gracias, funcionó en mi caso fue increíble.
Pooria Honarmand
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.