【问题标题】:Laravel groupBy on particular columnLaravel groupBy 在特定列上
【发布时间】:2022-06-16 23:18:49
【问题描述】:

我正在 PHP 7.4 上运行 Laravel 8 项目。我有一个名为add_ons 的表和一个名为Addon 的模型。 Addon 模型有一个名为 group 的列,这就是我想将某些行组合在一个对象下的方式,当我尝试在我的模型上使用 groupBy 方法时,我收到此错误:

语法错误或访问冲突:1055 SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“domainmonitor_db.add_ons.id”

为了实现我想要的分组功能,我缺少什么?

/**
 * Handle the incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function __invoke(Request $request)
{
    $addons = Addon::groupBy('group')->get();
}

【问题讨论】:

  • 下面的答案包含很多有用的信息,所以我不把它作为答案,而是评论:在config/database.php 中,检查你的Connection 的'strict' 设置。如果是'strict' => true,,我发现很多groupBy() 语句都失败并出现类似错误。您可以将其设置为 'strict' => false,,但请仔细阅读其任何缺点,特别是针对您的数据库引擎(MySQLPostgres 等)

标签: php sql laravel


【解决方案1】:

一些数据库系统——特别是 PostgreSQL——要求 allSELECT-ed 在带有 GROUP BY 的查询中是聚合列。

原因是数据的正确性;假设您在一列中有多行具有相同的值,而不是“分组依据”列 - DBMS 应该说什么是压扁行中列的值?它不知道这一点,DBMS 也不应该猜测。 此外,通过猜测该列中应该包含什么而不是强制执行,MySQL 会为分组查询返回垃圾数据。

当您使用裸 [Model]::groupBy() 时,它会查询所有列(即 SELECT * FROM...),其中许多列可能不是聚合列。

您声明您希望分组记录使用单个对象,但有一些未解决的问题:

  • 应该有哪些列?
  • 如果stripe_id 是对象的一部分,它应该来自哪一行?

您可能会发现有用的是 Illuminate\Support\Collection 接口的 groupBy() 方法,它仅按公共列组织对象,而不压缩任何数据:

$collection = Addons::query()->get();
$grouped_collection = $collection->groupBy('group');

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 2020-12-27
    • 2020-09-22
    • 1970-01-01
    • 2014-08-21
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多