2015-02-01 3 views
2

От Laravel 4 and Eloquent ORM - How to select the last 5 rows of a table, но мой вопрос немного другой.Как вернуть последние n записей в порядке поступления

Как вернуть последние N записей, упорядоченных по способу их создания (ASC).

Так, например, следующие записи вставляются в порядке:

first 
second 
third 
fourth 
fifth 

Я хочу, чтобы запрос, чтобы вернуть последние 2 записи

fourth 
fifth 

ответ

3

Laravel Смещение

DB::table('users')->skip(<NUMBER Calulation>)->take(5)->get();

Вы можете вычислить N, получив счетчик текущего запроса и пропустив $ query-> count() - 5, чтобы получить последние 5 записей или что угодно.

Ex

$query = User::all(); 
$count = ($query->count()) - 5; 

$query = $query->skip($count)->get(); 
+0

спасибо. Имеет ли это ** значительное влияние на производительность? –

+0

Нет совсем нет, так как вы уже будете делать тот же запрос. Просто добавьте его. Я включил пример в свой код. Помните только, чтобы строить сверху запроса и не делать 2 запросов к БД – Rafael

+0

@Rafael. Ваш второй пример фактически выполняет 2 запроса. Сначала извлеките все записи, а затем снова при использовании 'skip'. – lukasgeiter

1

В чистом SQL это делается с помощью подзапроса. Что-то вроде этого:

SELECT * FROM (
    SELECT * FROM foo 
    ORDER BY created_at DES 
    LIMIT 2 
) as sub 
ORDER BY created_at ASC 

Таким образом, ограничение происходит в подзапрос, а затем в главном запросе заказа на обратное. В Laravel нет встроенной поддержки подзапросов. Однако вы все еще можете это сделать:

$sub = DB::table('foo')->latest()->take(2); 
$result = DB::table(DB::raw('(' . $sub->toSql() . ') as sub')) 
      ->oldest() 
      ->get(); 

И если вы используете красноречив:

$sub = Foo::latest()->take(2); 
$result = Foo::from(DB::raw('(' . $sub->toSql() . ') as sub')) 
      ->oldest() 
      ->get(); 

Примечаниеlatest и oldest просто добавьте orderBy('created_at) с desc и asc соответственно.

Смежные вопросы