Me gustaría recuperar el último archivo insertado en mi tabla. Sé que el método first()
existe y le proporciona el primer archivo de la tabla, pero no sé cómo obtener la última inserción.
Me gustaría recuperar el último archivo insertado en mi tabla. Sé que el método first()
existe y le proporciona el primer archivo de la tabla, pero no sé cómo obtener la última inserción.
Respuestas:
Tendrá que ordenar por el mismo campo que está ordenando ahora, pero descendiendo. Como ejemplo, si tiene una marca de tiempo cuando se realizó la carga upload_time
, se haría 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();
Esto ordenará las filas en la tabla de archivos por tiempo de carga, orden descendente y tomará la primera. Este será el último archivo cargado.
orderBy
, noorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
Ordenar por fecha funciona más porque la fecha es una cadena y probablemente no esté indexada. Mientras que la clave primaria está indexada y funciona súper rápido. Incluso si created_at está indexado, es una cadena indexada y no INT en el caso de primaria. La cadena de índice tiene menos rendimiento.
orderBy('created_at', 'desc')
no le da la última fila. Ejemplo: 3 filas pueden tener exactamente el mismo valor TIMESTAMP y con orderBy('created_at', 'desc')
usted obtendrá la primera de las 3 (que no es necesariamente la última fila)
Use el último alcance proporcionado por Laravel fuera de la caja.
Model::latest()->first();
De esa manera no estás recuperando todos los registros. Un atajo más agradable para orderBy.
created_at
columna generada automáticamente ($timestamps = true)
en el Modelo, pero puede deshabilitarse si lo desea, por lo que tendría un error si no está definido
Nunca mencionó si está utilizando Eloquent, el ORM predeterminado de Laravel o no. En caso afirmativo, supongamos que desea obtener la última entrada de una tabla de usuario, por created_at, probablemente podría hacer lo siguiente:
User::orderBy('created_at', 'desc')->first();
Primero ordena a los usuarios por el campo created_at, de forma descendente, y luego toma el primer registro del resultado.
Eso le devolverá una instancia del objeto Usuario, no una colección. Por supuesto, para hacer uso de esta alternativa, debe tener un modelo de Usuario, que amplía la clase Eloquent. Esto puede sonar un poco confuso, pero es realmente fácil comenzar y ORM puede ser realmente útil.
Para obtener más información, consulte la documentación oficial que es bastante rica y bien detallada.
Para obtener los últimos detalles del registro
Model::all()->last();
oModel::orderBy('id', 'desc')->first();
Para obtener la última identificación de registro
Model::all()->last()->id;
o Model::orderBy('id', 'desc')->first()->id;
Laravel colecciones tiene método pasado
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Esta es la mejor manera de hacerlo.
all()
método en realidad carga todos los elementos. Esto no funcionará en una mesa con millones de registros.
last()
devuelven una sola instancia Eloquent y no una Colección, y llamar pluck()
es igual a llamar Model::all()->pluck('name')
, por lo tanto, devuelve el name
atributo de todas las filas de la tabla
Prueba esto :
Model::latest()->get();
Puede usar el último alcance proporcionado por Laravel con el campo que desea filtrar, digamos que se ordenará por ID, luego:
Model::latest('id')->first();
De esta manera, puede evitar ordenar por created_at
campo de forma predeterminada en Laravel.
Para obtener los últimos detalles del registro, use el siguiente código:
Model::where('field', 'value')->get()->last()
Otra forma elegante de hacerlo en Laravel 6.x (No estoy seguro, pero también debe funcionar para 5.x):
DB::table('your_table')->get()->last();
También puedes acceder a los campos:
DB::table('your_table')->get()->last()->id;
get()
método buscará todo your_table
y generará una Colección y el last()
método obtendrá el último elemento de esa colección. Entonces ya tendrá todos los datos de la tabla cargados en su memoria (incorrectos). Simplemente debe usar `DB :: table ('items') -> latest () -> first ();` detrás de escena ejecuta `orderBy ($ column, 'desc')` y busca el primer registro.
Model($where)->get()->last()->id
Si usted está buscando para la fila real que acaba de insertar con laravel 3 y 4 cuando se realiza una save
o create
acción en un nuevo modelo como:
$user->save();
-o-
$user = User::create(array('email' => 'example@gmail.com'));
entonces la instancia de modelo insertada se devolverá y se puede usar para acciones adicionales como redirigir a la página de perfil del usuario que acaba de crear.
Buscar el último registro insertado que funciona en un sistema de bajo volumen funcionará casi todo el tiempo, pero si alguna vez tiene que insertar inserciones al mismo tiempo, puede terminar consultando para encontrar el registro incorrecto. Esto realmente puede convertirse en un problema en un sistema transaccional donde se deben actualizar varias tablas.
De alguna manera, todo lo anterior no parece funcionar para mí en laravel 5.3, así que resolví mi propio problema usando:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
Espero poder rescatar a alguien.
ser conscientes de que last()
, latest()
no son deterministas si usted está buscando un secuencial o evento de grabación / ordenada. Los últimos / recientes registros pueden tener exactamente la misma created_at
marca de tiempo, y lo que obtiene no es determinista. También lo hacen orderBy(id|foo)->first()
. Otras ideas / sugerencias sobre cómo ser determinista son bienvenidas.