【问题标题】:Laravel 4 - How to use 'offset' in stead of 'page' with Eloquent's ->paginate()?Laravel 4 - 如何在 Eloquent -> paginate() 中使用“偏移”而不是“页面”?
【发布时间】:2014-01-12 15:24:10
【问题描述】:

我正在将现有的 REST API 迁移到 Laravel 4.1,该 API 当前使用 offset 作为查询字符串参数来指定记录的偏移量 .

我想使用默认的 Eloquent 的 paginate(),但是这些搜索是 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 和 Web 视图使用相同的控制器。因此,我希望通过某种方式使第一个工作正常。

【问题讨论】:

  • 你能分享一些示例代码吗?
  • 只要把 $perpage = Input::get('perpage');并在 url 中加入 ?perpage=200 ?

标签: php pagination laravel laravel-4


【解决方案1】:

但是我不能对 API 和 Web 视图使用相同的控制器。所以我更喜欢某种方式来使第一个工作。

为什么不呢?如果您已经知道?offset 将在 API 中可用,?page 在您的正常视图中可用。只需检测找到哪个并适当地应用它。


也就是说,您可以检索查询构建器使用的分页器环境实例,并将您定义的页码传递给它。

$perPage = 50;
$currentPage = 1;

if ($offset = Input::get('offset'))
{
    $currentPage = ($offset / $perPage);
}

Warehouse::resolveConnection()->getPaginator()->setCurrentPage($currentPage);

$warehouses = Warehouse::orderBy('name')->paginate($perpage);

请注意,虽然我对此进行了测试并且它有效,但我不知道它会对您可能在同一页面上运行的其他查询产生多大影响。仔细看,慎用。

【讨论】:

  • 谢谢。我希望有一个更清洁的解决方案,但我现在会使用它。
  • 我认为无论解决方案如何,您都必须覆盖该特定 Eloquent 模型使用的分页器实例,这就是您检索它的方式(据我所知)。否则,您将全局覆盖所有实例,这可能会与您在其他地方的代码混淆。
  • 坦率地说,如果一个解决方案只有几行代码,那对我来说很干净。 ;)
  • 对于 Laravel 5,我认为它不再有效。没有找到 getPaginator() 函数。构建器上的 paginate() 函数每次调用都会返回一个新的 Paginator。目前我找到了如何在 PaginationServiceProvider 中全局更改请求变量名称。
  • @elpd 我必须检查 L5 的实现是什么。我不熟悉所做的每一个小改变,以及如何以不同的方式完成上述操作。不过,我确实知道,如果需要,您可以使用中间件添加额外的请求数据。可能会这样做并避免需要完全修改模型的连接或分页器。
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2020-10-25
  • 2016-06-09
  • 2014-10-01
  • 2015-04-23
相关资源
最近更新 更多