Я хотів би отримати останній файл, вставлений у свою таблицю. Я знаю, що метод first()
існує і надає вам перший файл у таблиці, але я не знаю, як отримати останню вставку.
Я хотів би отримати останній файл, вставлений у свою таблицю. Я знаю, що метод first()
існує і надає вам перший файл у таблиці, але я не знаю, як отримати останню вставку.
Відповіді:
Вам потрібно буде замовити те саме поле, яке ви замовляєте на даний момент, але у спадному порядку. Наприклад, якщо у вас є штамп часу, коли завантаження було здійснено upload_time
, ви зробите щось подібне;
Для попереднього 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();
Порядок на дату працює довше, оскільки дата є рядовою і, швидше за все, не індексується. У той час як первинний ключ індексується і працює дуже швидко. Навіть якщо create_at індексується, він є індексованим рядком, а не INT у разі первинного. Індексний рядок має меншу продуктивність.
orderBy('created_at', 'desc')
не дає останнього рядка. Приклад: 3 рядки можуть мати точно однакове значення TIMESTAMP, і orderBy('created_at', 'desc')
ви отримаєте перший з 3 (що не обов'язково є останнім рядком)
Використовуйте останню область, яку надає Laravel поза коробкою.
Model::latest()->first();
Таким чином, ви не отримуєте всі записи. Приємніший ярлик на замовлення.
created_at
стовпець ($timestamps = true)
у Моделі, але його можна відключити за бажанням, щоб ви мали помилку, якщо не визначено
Ви ніколи не згадували, використовуєте ви красномовний, ORM за замовчуванням Laravel чи ні. Якщо у вас є, скажімо, ви хочете отримати останню запис таблиці користувача від create_at, ви, ймовірно, можете зробити так:
User::orderBy('created_at', 'desc')->first();
Спочатку він упорядковує користувачів за полем create_at у спадному порядку, а потім бере перший запис результату.
Це поверне вам екземпляр користувача, а не колекцію. Звичайно, щоб скористатися цією альтернативою, ви повинні мати модель користувача, що розширює красномовний клас. Це може здатися дещо заплутаним, але почати дійсно легко, і ORM може бути дуже корисною.
Для отримання додаткової інформації ознайомтеся з офіційною документацією, яка є досить багатою та детальною.
У колекціях Laravel останній метод
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Це найкращий спосіб зробити це.
all()
метод фактично завантажує всі елементи. Це не працюватиме на таблиці з мільйонами записів.
last()
повертає один красномовний екземпляр, а не Колекцію, і заклик, pluck()
що дорівнює виклику Model::all()->pluck('name')
, тому повертає name
атрибут усіх рядків у таблиці
Спробуйте це :
Model::latest()->get();
Ви можете використовувати останню область, надану Laravel, із полем, яке ви хочете відфільтрувати, скажімо, це буде впорядковано за ідентифікатором, а потім:
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 (стовпець $, 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()
. Інші ідеї / пропозиції, як бути детермінованими, вітаються.