В Laravel для работы с таблицами БД мы используем модели, и представлены они для нас в виде отдельных сущностей согласно ORM. Для самого же сервера БД суть работы с ней не меняется. Соответственно, если мы составляем ресурсоемкие запросы в Laravel, то нагрузка на сервер происходит такая же, как если бы мы это делали путём SQL запроса напрямую. Работая с большим набором данных рационально при запросе выполнять ограничение на количество строк, возвращаемых при запросе.
В Laravel мы можем использовать методы limit() и offset() при выборке данных, назначение которых с точки зрения SQL запроса очевидно.
News::limit(10); //или \DB:table('news')->limit(10);
Таким образом, вы можем выбрать первые 10 записей из таблицы БД. В результате запрос в БД будет выглядеть следующим образом:
select * `table` limit 10
Методы take() и skip() могут так же выполнить ограничение и смещение строк при запросе. В качестве параметра каждый из этих методов так же принимает целое число.
News::skip(10)->take(10); // или \DB::table('news')->skip(10)->take(10);
В результате мы получаем такой запрос в базу данных:
select * `table` limit 10 offset 10
Как можно понять из запроса — limit выставляет ограничение по количеству строк, а offset выставляет смещение на указанное количество строк. Теперь можно посмотреть на примере использования их в контроллерах.
Давайте предположим, что у нас есть таблица, в которой хранятся 100 записей. В нашем примере нам следует выбрать 10 записей и задать смещение равное 10. В результате у нас получиться такой вот код:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; class NewsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $News = News::offset(10)->limit(10); } }
В результате в БД пойдёт запрос следующего вида:
select * from `news` limit 10 offset 10
Получить похожий результат, как и в предыдущем примере, мы можем с помощью методов take() и skip(). Назначение этих методов вам уже известно. В итоге в контроллере мы получим следующий код:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; class NewsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $News = News::take(10)->skip(10); // или DB::table('news')->take(10)->skip(10)->first(); } }
Аналогичным образом в базу придёт запрос следующего вида:
select `news`.`*` from `news` limit 10 offset 10
Как вы можете заметить методы разные, но результат вы получите одинаковый. Ограничение запросов используется практически на каждом сайте, где происходит работа с таблицами. Это может быть вывод список новостей, товаров с постраничной навигацией, либо вывод последних записей на страницах.