Tengo una relación de laravel hasMany y quiero buscar los últimos 10 comentarios de una tabla y ordenarlos en orden descendente. Así es como se ve mi mesa

id  |   user_id |   comment_text
----------------------------------------------------------
1       30          foo
2       23          bar
3       17          hello
4       30          world
5       12          lorem
6       10          ipsum
7       17          dummy

Mis resultados deberían ser

id  |   user_id |   comment_text
----------------------------------------------------------
5       12          lorem
6       10          ipsum
7       17          dummy    

Cómo estoy ejecutando la consulta para obtener los resultados esperados

SELECT * FROM (
    SELECT * FROM comments ORDER BY id DESC LIMIT 3
) sub
ORDER BY id ASC

¿Cómo puedo hacer esto en un modelo de laravel? ¿Puedo ejecutar una subconsulta en una relación? Esta es mi implementación hasta ahora

public function latestComments($limit = 3)
  {
    return $this->hasMany(Comment::class)     
      ->orderByDesc('id')
      ->limit($limit);
  }
3
sammyukavi 14 feb. 2018 a las 12:21

2 respuestas

La mejor respuesta

Encontré una solución. Usando la función reverse de Laravel, puedo obtener los resultados deseados, todo lo que necesito hacer es llamar a reverse en la propiedad.

$post->latestComments->reverse()
0
sammyukavi 14 feb. 2018 a las 10:06

Estás en el camino correcto, solo corrígelo un poco:

public function latestComments($limit = 3)
{
     return $this->hasMany(Comment::class)     
        ->orderBy('id', 'desc')
        ->take($limit);
}

Puede leer más de take y orderBy en documentos oficiales

2
Nikola Gavric 14 feb. 2018 a las 09:58