Я переношу существующий REST API в Laravel 4.1, и API в настоящее время использует offset
как параметр querystring, чтобы указать, что должно быть смещением записей.
Я хотел бы использовать paginate()
по умолчанию Eloquent, но они ищут параметр querystring page
. И, конечно, он использует номер страницы (например, 2) вместо смещения (например, 200).
Есть ли простой способ настроить функцию paginate
в этой ситуации? Или мне нужно использовать функции ->skip()
и ->take()
и сами сделать ссылки на следующую страницу?
@Anam: Я хочу использовать:
$warehouses = Warehouse::orderBy('name') ->paginate($perpage);
Это работает с http://example.org/api/warehouses?page=2 , но я хочу, чтобы это работало с http://example.org/api/warehouses?offset=200
Со смещением я могу использовать:
$warehouses = Warehouse::orderBy('name') ->skip($offset) ->take($perpage) ->get();
Но тогда я не могу использовать тот же контроллер для API и веб-представления. Поэтому я бы предпочел, чтобы кто-то работал первым.
Но тогда я не могу использовать тот же контроллер для API и веб-представления. Поэтому я бы предпочел, чтобы кто-то работал первым.
Почему нет? Если вы уже знаете, что ?offset
будет доступно на API и ?page
в обычном режиме. Просто определите, что найдено и примените его соответствующим образом.
Тем не менее, вы можете получить экземпляр окружения paginator, который использует построитель запросов, и передать ему номер страницы, который вы определяете.
$perPage = 50; $currentPage = 1; if ($offset = Input::get('offset')) { $currentPage = ($offset / $perPage); } Warehouse::resolveConnection()->getPaginator()->setCurrentPage($currentPage); $warehouses = Warehouse::orderBy('name')->paginate($perpage);
Обратите внимание, что, хотя я тестировал это, и он работает, я не знаю, насколько это повлияет на другие запросы, которые вы можете запустить на одной странице. Изучите его, используйте с осторожностью.