Я хотел бы получить последний файл, вставленный в мою таблицу. Я знаю, что метод first()
существует и предоставляет вам первый файл в таблице, но я не знаю, как получить последнюю вставку.
Я хотел бы получить последний файл, вставленный в мою таблицу. Я знаю, что метод first()
существует и предоставляет вам первый файл в таблице, но я не знаю, как получить последнюю вставку.
Ответы:
Вам нужно будет упорядочить по тому же полю, которое вы сейчас упорядочиваете, но по убыванию. Например, если у вас есть отметка времени, когда загрузка была завершена upload_time
, вы должны сделать что-то вроде этого;
Для Pre-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
Для Laravel 4 и далее
return DB::table('files')->orderBy('upload_time', 'desc')->first();
Для Laravel 5.7 и выше
return DB::table('files')->latest('upload_time')->first();
Это упорядочит строки в таблице файлов по времени загрузки, по убыванию и возьмет первую. Это будет последний загруженный файл.
orderBy
не такorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
Порядок по дате работает дольше, потому что дата строковая и, скорее всего, не проиндексирована. Пока первичный ключ индексируется и работает супер быстро. Даже если созданный индексированный, он является индексированной строкой, а не INT в случае первичного. Индексная строка имеет меньшую производительность.
orderBy('created_at', 'desc')
не дает вам последний ряд. Пример: 3 строки могут иметь одно и то же значение TIMESTAMP, и вместе с orderBy('created_at', 'desc')
вами вы получите первую из 3 (которая не обязательно является последней строкой)
Используйте новейшие возможности, предоставленные Laravel из коробки.
Model::latest()->first();
Таким образом, вы не получите все записи. Хороший ярлык на заказ.
created_at
столбец ($timestamps = true)
в модели, но может быть отключен по желанию, поэтому у вас будет ошибка, если она не определена
Вы никогда не упоминали, используете ли вы Eloquent, ORM по умолчанию Laravel или нет. В случае, если вы, скажем, хотите получить самую последнюю запись таблицы User, с помощью create_at, вы, вероятно, могли бы сделать следующее:
User::orderBy('created_at', 'desc')->first();
Сначала он упорядочивает пользователей по полю create_at по убыванию, а затем принимает первую запись результата.
Это вернет вам экземпляр объекта User, а не коллекцию. Конечно, чтобы использовать эту альтернативу, вам нужна модель User, расширяющая класс Eloquent. Это может показаться немного запутанным, но это действительно легко начать, и ORM может быть действительно полезным.
Для получения дополнительной информации ознакомьтесь с официальной документацией, которая довольно богата и детальна.
Чтобы получить последние детали записи
Model::all()->last();
илиModel::orderBy('id', 'desc')->first();
Чтобы получить последний идентификатор записи
Model::all()->last()->id;
или Model::orderBy('id', 'desc')->first()->id;
У коллекции Laravel есть метод last
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Это лучший способ сделать это.
all()
метод на самом деле загружает все элементы. Это не будет работать на столе с миллионами записей.
last()
возвращает один экземпляр Eloquent, а не коллекцию, и вызов pluck()
по нему равен вызову Model::all()->pluck('name')
, поэтому возвращается name
атрибут всех строк в таблице
Попробуй это :
Model::latest()->get();
Вы можете использовать последнюю область, предоставленную Laravel, с полем, которое вы хотите отфильтровать, скажем, оно будет упорядочено по ID, затем:
Model::latest('id')->first();
Таким образом, вы можете избежать упорядочения по created_at
полю по умолчанию в Laravel.
Чтобы получить последние детали записи, используйте код ниже:
Model::where('field', 'value')->get()->last()
Еще один интересный способ сделать это в Laravel 6.x (не уверен, но должен работать и для 5.x):
DB::table('your_table')->get()->last();
Вы также можете получить доступ к полям:
DB::table('your_table')->get()->last()->id;
get()
метод извлекает все из your_table
коллекции и генерирует коллекцию, а last()
метод получает последний элемент из этой коллекции. Таким образом, у вас уже есть все данные из таблицы, загруженные в вашу память (плохо). Вы должны просто использовать `DB :: table ('items') -> latest () -> first ();` за сценой он выполняет `orderBy ($ column, 'desc')` и извлекает первую запись.
Model($where)->get()->last()->id
Если вы ищете фактическую строку, которую вы только что вставили с помощью Laravel 3 и 4, когда выполняете действие save
или create
для новой модели, например:
$user->save();
-или-
$user = User::create(array('email' => 'example@gmail.com'));
затем вставленный экземпляр модели будет возвращен и может использоваться для дальнейших действий, таких как перенаправление на страницу профиля только что созданного пользователя.
Поиск последней вставленной записи работает в системе с низким уровнем громкости, будет работать почти все время, но если вам когда-либо понадобится вставить вставки одновременно, вы можете в итоге запросить неправильную запись. Это действительно может стать проблемой в транзакционной системе, где необходимо обновить несколько таблиц.
Почему-то все вышеперечисленное не работает для меня в laravel 5.3, поэтому я решил свою проблему, используя:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
надеюсь, смогу выручить кого-то.
иметь в виде , что last()
, latest()
не являются детерминированным , если вы ищете последовательный или событие / заказанную запись. Последние / последние записи могут иметь одинаковую created_at
временную метку, и возвращаемая вами информация не является детерминированной. Так и делай orderBy(id|foo)->first()
. Другие идеи / предложения о том, как быть детерминированным, приветствуются.