使用 Eloquent 的 Laravel 块方法

新手上路,请多包涵

对于处理大型数据库,laravel 提供了这里的块方法 https://laravel.com/docs/5.1/queries#retrieving-results

但是我怎样才能在这个查询中使用块方法,

  $data = Inspector::latest('id')
                ->select('id', 'firstname', 'status', 'state', 'phone')
                ->where('firstname', 'LIKE', '%' . $searchtext . '%')
                ->get();

我在哪里返回这样的json响应,

 echo json_encode($data);

有什么建议么….

原文由 Aamir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 519
2 个回答

据我了解, chunk() 方法适用于您需要处理大型数据集并逐块对该数据块 执行操作 时使用。

从您的问题来看,听起来您正在执行查询然后将数据作为 JSON 返回,所以对我来说,这听起来不像您正在对需要分块的数据集采取行动。

如果你想分解返回的 JSON 数据,你应该查看 pagination

您可以像这样将分页应用于您的查询:

 $data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->paginate();

您可以通过将数字传递给 paginate 方法来指定每个集合的大小:

 $data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->paginate(25);

如果我误解了并且您确实想要进行分块,我相信您可以执行以下操作:

 $data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->chunk(50, function($inspectors) {
        foreach ($inspectors as $inspector) {
            // apply some action to the chunked results here
        }
    });

此外,如果您要返回一个雄辩的对象,它将自动转换为 json,因此据我所知,您不需要执行 json_encode()

编辑

如果我完全误解了你,你真正想做的是:

 { 1000 records } -> this is the result of your query

把它分成这个:

 {
    { 300 records},
    { 300 records},
    { 300 records},
    { 100 records},
}

然后你想要 Collection 的块方法:

 $data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->get() // now we're working with a collection
    ->chunk(300);

请记住,在您获得查询结果之前,您没有使用 Collection ,因此如果您只是调用 chunk() 它会期待一个回调,该回调将应用于整个数据集,当您使用 Eloquent

请参阅此处的 Collection chunk() 方法的进一步阅读: https ://laravel.com/docs/5.3/collections#method-chunk

否则…您能否为您实际在做的事情提供更多背景信息?听起来你真的需要分页。你在用 JSON 数据做什么,你是如何调用 HTTP 请求的,是通过 ajax 吗?为什么一次需要全部 1000 条记录?

如果您确实需要将 1000 个的整个数据集发送到客户端,但一次发送 300 个,那么您不想使用块。想想 chunk() 在 eloquent 的上下文中的用途,它不是为了让块一次返回一个块,直到它拥有整个数据集 - 它是为了对块应用一个动作然后返回整个集合和使用它的目的是通过加载整个集合来处理操作,一次不会占用太多内存。

如果您希望逐位获取整个数据集并且分页不适用于您的情况(我还没有明白为什么!)您将需要多次调用 HTTP 请求以逐位获取数据并在每个请求你已经拥有的和你需要的。

原文由 haakym 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您使用 Laravel ORM Eloquent 加载大型集合,您可以使用文档中提到的 chunk()cursor() 方法。这将延迟加载集合并减少内存使用量。

一个例子:

 Inspector::query()
        ->where('status', true)
        ->cursor() //for collection lazy loading
        ->each(function (Inspector $inspector) {
            $inspector->markAsInspected();
        });

查看文档链接以获取更多示例。

原文由 Abdelsalam Megahed 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题