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

PrestonDocks
fuente

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

Rob Gordijn
fuente
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
Agregué
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);
agm1984
fuente
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