【问题标题】:Laravel query builder GROUP BY method alongside with SKIP and TAKE methodsLaravel 查询构建器 GROUP BY 方法以及 SKIP 和 TAKE 方法
【发布时间】:2019-06-19 03:17:19
【问题描述】:

我有大约 50000 条记录,我正在使用服务器端处理的 Datatable 中显示它们。 在我的查询中,我将groupBy() 方法与skip()take() 方法一起应用。

我希望能够应用限制 之后 groupBy() 例如

如果限制为 10,它应该返回 10 个组而不是 10 条记录。

DB::table('actions')->whereBetween('timestamp', 
array($dates['startDate'], $dates['endDate']))
->where('shop_name', $shopName)
->skip($start)
->take(10)
->get()
->groupBy('product_id');

通过这个查询,我得到 10 个记录而不是 10 个组。

【问题讨论】:

  • 把你的groupBy()放在你的->get()之前
  • 我试过然后 groupBY() 不起作用。它显示 10 个没有组的记录。
  • 它是否显示了具有 10 个不同 product_id 的 10 个不同操作?因为那是你分组的依据。您必须将 groupBy() 放在 get() 之前。
  • 是的,它使用 10 个不同的 product_id 显示了 10 个不同的操作。
  • 然后它起作用了,您有 10 个不同的组,因为您有超过 10 个以上的 product_id,您将收到 10 条记录。它完全按照你的要求做了。

标签: laravel query-builder laravel-5.7 laravel-query-builder skip-take


【解决方案1】:

尝试省略 take(10) 并在查询的最后但在 get() 之前添加 limit(10)

【讨论】:

  • 我试过它不返回 10 组。它返回 3 组 10 条记录
【解决方案2】:
DB::table('actions')
            ->whereBetween('timestamp', array($dates['startDate'], $dates['endDate']))
            ->where('shop_name', $shopName)
            ->get()
            ->groupBy('product_id')
            ->splice($start,$rowperpage);

这个命令奏效了。

【讨论】:

  • 虽然这会工作,但您是在获取50,000 记录后执行拼接操作。从内存的角度来看,这不是一个理想的情况。我编辑了我的答案以包含 offset() 声明。如果你愿意,你可以用它来抵消你的查询。
【解决方案3】:

您的查询语句的顺序错误。以下应该可以解决问题。请注意 groupBy() 在您的 take()get() 之前。

在您的情况下,您在获取记录后进行分组。

DB::table('actions')
    ->whereBetween('timestamp', array($dates['startDate'], $dates['endDate']))
    ->where('shop_name', $shopName)
    ->groupBy('product_id')
    ->skip($start)
    ->take(10)
    ->get()

【讨论】:

  • 您也可以使用->limit(10) 而不是->take(10)。 Take是limit的别名。这是正确的答案。 竖起大拇指
  • 不客气。如果它对您有用,请随意投票/标记为答案。见What should I do when someone answers
  • @Mozammil 哪个是最好的方法 splice() 方法或 take 和 skip 方法?
  • 没有拼接方法。 take() 的别名是 limit()。这只是个人选择的问题。他们都做同样的事情:)
  • 他们是一种拼接方法,我在 group by 之后尝试过这个方法,它也像一个魅力 'splice($start,$rowperpage)'
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 2020-09-23
  • 2017-04-13
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多