Seleccionar la Última Fila de la Tabla

Me gustaría recuperar el último archivo insertado en mi mesa. Sé que el método first() existe y se proporciona con el primer archivo en la tabla, pero no sé cómo conseguir la última inserción.

  • Véase también stackoverflow.com/questions/33321447/… Cómo ordenar un una relación existente (hasMany)
  • Esto es para cualquier persona que preguntar y contestar acerca de Laravel. Recuerde que es importante especificar que versión de Laravel que están hablando. En general las versiones 4 y 5 tienen diferencias y las versiones anteriores también.

13 Kommentare

  1. 176

    Tendrás que ordenar por el mismo campo que usted está ordenando por ahora, pero descendente.
    Como un ejemplo, si usted tiene una marca de tiempo cuando la carga se ha hecho llamados upload_time, tendría que hacer algo como esto;

    Para Pre-Laravel 4

    return DB::table('files')->order_by('upload_time', 'desc')->first();

    Para Laravel 4 y en adelante

    return DB::table('files')->orderBy('upload_time', 'desc')->first();

    Para Laravel 5.7 y en adelante

    return DB::table('files')->latest('upload_time')->first();

    Este será el orden de las filas en la tabla de archivos por el tiempo de carga, orden descendente, y tomar la primera. Este será el último archivo subido.

    • Para Laravel 4 este debe ser orderBy, no order_by
    • Cuando se utiliza ORM, esta es una manera correcta: User::orderby('created_at', 'desc')->first();
    • Laravel 5.x = orderBy('created_at', 'desc')
    • ¿Por qué usas created_at columna? Mucho más rápido de usar IDENTIFICADOR de clave principal. Laravel 5.x Files::orderBy(id', 'desc')->first(); Orden por fecha trabaja más tiempo, porque la fecha es de cadena y lo más probable es que no indexadas. Mientras que la clave principal es indexado y funciona super rápido. Incluso si created_at indexado, es indexado cadena y no de tipo INT en el caso de primaria. Índice de la cadena tiene menos rendimiento.
    • comentario debe ser la respuesta, porque a veces orderBy('created_at', 'desc') no dan el último de la fila. Ejemplo: 3 filas pueden tener exactamente el mismo valor de marca de tiempo y con orderBy('created_at', 'desc') obtendrá el primero de los 3(que no es necesariamente el último de la fila)
    • Ya que sólo el último valor insertado es necesario – no pedidos por auto_increment campo id de los beneficios en rendimiento?..
    • Eso es como Windows -> Start -> Shutdown :D.
    • Hay que tener cuidado con @KorbenDallas y @bruddha comentarios que podrían ser mejores soluciones que mediante el uso de la created_at campo, pero el problema viene cuando la principal clave de IDENTIFICACIÓN no es un auto_increment índice.

  2. 86

    El uso de la última ámbito proporcionada por Laravel fuera de la caja.

    Model::latest()->first();

    De esta forma no se recuperan todos los registros. Un mejor acceso directo a orderBy.

    • Tenga en cuenta que este método de utilizar la función de auto-generado created_at columna ($timestamps = true) en el Modelo, pero puede ser desactivado en el deseo por lo tanto se tendría un error si no definida
    • Estoy usando Laravel 5.7 y tratando de hacer esto en un Modelo que aún se recupera todos los registros para mí.
    • Tenga en cuenta que si usted tiene múltiples registros añadidos dentro del mismo segundo, la created_at será el mismo que para estos registros y por lo tanto el registro devuelto por el último (el) puede no ser el registro que usted espera que sea.
    • Tenga en cuenta que usted no necesita un ‘created_at de la columna». Puede especificar a partir de qué columna que desea la última. Por ejemplo: Modelo::más reciente(‘dateColumn’)->primero();
    • Esto puede fallar para conseguir el verdadero último de la fila si dos de la fila se inserta dentro de 1 segundo (en realidad causado problemas en la unidad de pruebas).
  3. 72

    Nunca se menciona si usted está usando Elocuente, Laravel del ORM por defecto o no. En caso de que, digamos que usted desea obtener la última entrada de una tabla de Usuario, por created_at, usted probablemente podría hacer como sigue:

    User::orderBy('created_at', 'desc')->first();

    Primer pedido de los usuarios por created_at campo, descendingly y, a continuación, se toma el primer registro del resultado.

    Que le devolverá una instancia del objeto de Usuario, no una colección. Por supuesto, para hacer uso de esta alternativa, tienes que tener un modelo de Usuario, que se extiende Elocuente de la clase. Esto puede sonar un poco confuso, pero es muy fácil para empezar y ORM puede ser muy útil.

    Para obtener más información, consulte el la documentación oficial que es bastante rico y bien detallado.

  4. 34

    Para obtener el último registro de detalles

    1. Model ::all()->last(); o
    2. Model ::orderBy('id', 'desc')->first();

    Para obtener el último id de registro

    1. Model::all()->last()->id; o
    2. Model ::orderBy('id', 'desc')->first()->id;
    • Usted señor salvó mi día 🙂
  5. 13

    Laravel colecciones método de última

    Model::all() -> last(); //last element 
    Model::all() -> last() -> pluck('name'); //extract value from name field. 

    Esta es la mejor manera de hacerlo.

    • Docs en laravel.com/docs/5.1/collections#method-last
    • Sólo quería señalar que la all() método de carga de todos los elementos. Esto no funcionará en una tabla con millones de registros.
    • En adición a Steven Jeffries comentario, me gustaría señalar que llamar a last() devuelve un Elocuente ejemplo y no una Colección, y llamando pluck() en que es igual a la llamada de Model::all()->pluck('name'), por lo tanto devolver el name atributo de todo las filas de la tabla
    • Este método es peor en realidad. Se obtienen último raw usando PHP ejecución en lugar de hacerlo como el nivel de DB. ¿Qué pasa si la tabla tiene millones de raw, entonces usted sabe cuánto ineficiente puede ser?
    • Esta es la mejor manera de hacerlo. – ¡No! Nunca ha sido y nunca será. Usted estaría de carga todo de filas en lugar de sólo el que usted necesita.
  6. 12

    Intente esto :

    Model::latest()->get();
    • Esto devolverá varias filas. Él tiene una sola fila. primero() le ayudará con orderBy() de la cláusula.
    • Esto sólo funcionará si usted tiene created_at definido.
    • Esto puede fallar para conseguir el verdadero último de la fila si dos de la fila se inserta dentro de 1 segundo (en realidad causado problemas en la unidad de pruebas).
  7. 4

    Para obtener los últimos detalles del registro, utilice el código siguiente:

    Model::where('field', 'value')->get()->last()
    • No lo use. Esta es una muy mala práctica, existe un ámbito de aplicación más reciente (la) proporciona acceso directo a la última fila insertada.
  8. 1

    Si usted está buscando para la fila recién insertada con Laravel 3 y 4 al realizar una save o create acción en un nuevo modelo como:

    $user->save();

    -o-

    $user = User::create(array('email' => '[email protected]'));

    a continuación, inserta el modelo de instancia que será devuelto y se puede utilizar para más de acción, tales como redirigir a la página de perfil del usuario que acaba de crear.

    Buscando el último registro insertado obras en volumen bajo el sistema de trabajo casi todo el tiempo, pero si alguna vez tiene que inserta ir en el mismo tiempo, usted puede terminar encima de consulta para encontrar el registro equivocado. Esto realmente puede ser un problema en un sistema transaccional, donde varias tablas necesidad actualizado.

  9. 1

    De alguna manera, todo lo anterior no parece funcionar para mí en laravel 5.3,
    así que he resuelto mi problema utilizando:

    Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();

    esperanza soy capaz de fianza a alguien.

  10. 1

    Otra forma elegante de hacerlo en Laravel 6.x (Seguro, pero debe trabajar para 5.x aswell) :

    DB::table('your_table')->get()->last();

    Puede acceder a campos de :

    DB::table('your_table')->get()->last()->id;

    • También funciona para mí en Laravel 5.8, acaba de publicar la respuesta antes de ver el tuyo
  11. 0

    Si la tabla tiene un campo de fecha, este(User::orderBy('created_at', 'desc')->first();) es la mejor solución, creo yo.
    Pero no hay ningún campo de fecha, Model ::orderBy('id', 'desc')->first()->id; es la mejor solución, estoy seguro.

  12. 0

    Uso Model::where('user_id', $user_id)->latest()->get()->first();
    se devolverá sólo un registro, en caso de no encontrar, volverá null.
    Espero que esto ayude.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea