2013-05-14 3 views
66

Я хочу получить последний файл, вставленный в таблицу. Я знаю метод «первым», который предоставляет вам первый файл в таблице, но я не знаю, как это сделать, чтобы получить последнюю вставку.Laravel выберите последнюю строку в таблице базы данных

Thx.

+0

Также см. Http://stackoverflow.com/questions/33321447/how-do-i-order-a-relationship-in-laravel/33321448#33321448 Как отсортировать существующее отношение (hasMany) –

+0

Это для кто спрашивает и отвечает ли Laravel. Помните, что важно указать версию Laravel, о которой вы говорите. Обычно версии 4 и 5 имеют отличия и более старые версии. – Heroselohim

ответ

101

Вам необходимо сделать заказ у того же поля, которое вы заказываете, но спускаетесь. В качестве примера, если у вас есть отметка времени при завершении загрузки, которая называется 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(); 

Это прикажет строки в таблице файлов по времени загрузки, порядке убывания и взять первый один. Это будет последний загруженный файл.

+13

Для Laravel 4 это должно быть 'orderBy', а не' order_by' –

+7

Когда вы используете ORM, это правильный путь: 'User :: orderby ('created_at', 'desc') -> first();' –

+0

Laravel 5.x = 'orderBy ('created_at', 'desc')' – 0x1ad2

1

Если вы ищете фактической строки, которые вы только что вставили с Laravel 3 и 4 при выполнении save или create действие на новой модели, как:

$user->save(); 

-или-

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

, то экземпляр вставленной модели будет возвращен и может использоваться для дальнейших действий, таких как перенаправление на страницу профиля только что созданного пользователя.

Поиск последних вставленных работ по записи в системе с низким объемом будет работать почти все время, но если вам когда-либо понадобится вставлять вставку, вы можете завершить поиск, чтобы найти неправильную запись. Это действительно может стать проблемой в транзакционной системе, где необходимо обновить несколько таблиц.

49

Вы никогда не говорили о том, используете ли вы Eloquent, ORAR по умолчанию Laravel или нет. В случае, если вы, скажем, вы хотите, чтобы получить последнюю запись таблицы пользователя, с помощью created_at, вы, вероятно, могли бы сделать следующим образом:

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

Сначала упорядочивает пользователей по created_at поле, по убыванию, а затем он принимает первая запись результата.

Это вернет вам экземпляр объекта User, а не коллекции. Разумеется, чтобы использовать эту альтернативу, у вас должна быть модель User, расширяющая класс Eloquent. Это может показаться немного запутанным, но очень легко начать работу, и ORM может быть действительно полезной.

Для получения дополнительной информации ознакомьтесь с official documentation, который довольно богат и детализирован.

+4

Это должен быть правильный ответ сейчас , –

+1

Решите проблему, которую я пытаюсь решить более 4 дней. Огромное спасибо. – kehinde

7

Laravel коллекции есть метод последнего

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

Это самый лучший способ сделать это.

+0

Документы на http://laravel.com/docs/5.1/collections#method-last – everyman

+7

Просто хотел указать, что метод 'all()' фактически загружает все элементы. Это не будет работать на столе с миллионами записей. –

+1

В дополнение к комментарию Стивена Джеффриса я хотел бы указать, что вызов 'last()' возвращает один экземпляр Eloquent, а не Collection, и вызывает 'pluck()', равный вызову 'Model :: all () -> pluck ('name') ', поэтому возвращает атрибут' name' * all * строк в таблице – ivcandela

10

Чтобы получить последние записи деталей

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

Чтобы получить последний идентификатор записи

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

Как-то все выше, кажется, не работает для меня в Laravel 5.3, поэтому я решил мой собственный проблема с использованием:

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

Надеюсь, я смогу подзабыть кого-то.

24

Используйте последнюю область, предоставленную Ларавелем из коробки.

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

Таким образом, вы не получаете все записи. Хороший ярлык для заказа.

+2

Обратите внимание, что этот метод использует автоматически созданный столбец 'created_at'' ($ timestamps = true) 'в модели, но может быть отключен по желанию, поэтому у вас будет ошибка, если не определено – Plotisateur

+2

действительно вам нужно позвонить первым на 'последних ': D? Это звучит не очень красноречиво. – Adam

-3

Чтобы получить последнюю запись детали, используйте код ниже:

Model::where('field', 'value')->get()->last() 
+0

Не используйте его. Это очень плохая практика, когда есть область последних(), которая обеспечивает прямой доступ к последней вставленной строке. –

6

Попробуйте это:

Модель :: последняя() -> Get();