按不工作分组- Laravel

qxsslcnc  于 2022-12-24  发布在  其他
关注(0)|答案(9)|浏览(112)

我无法在Laravel 5.3中运行此简单查询

$top_performers = DB::table('pom_votes')
        ->groupBy('performer_id')
        ->get();

它给我:

SQLSTATE[42000]: Syntax error or access violation: 1055 'assessment_system.pom_votes.id' isn't in GROUP BY (SQL: select * from `pom_votes` group by `performer_id`)

但是,如果我从错误中复制原始查询并直接在PhpMyAdmin中触发,它就可以正常工作。
我已经检查过了:
https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset
任何帮助都将受到欢迎。
谢谢你,
帕斯沃拉

y1aodyip

y1aodyip1#

编辑应用程序的数据库配置文件config/database.php
mysql数组中,设置strict => false以禁用MySQL的严格模式

up9lanfz

up9lanfz2#

也许您的问题是由于您使用的是MySQL服务器版本5.7.5+。从这个版本的GROUP BY的工作方式发生了变化,因为他们使它的行为,以SQL99兼容(而在以前的版本,它不是)。
尝试通过或更改MySQL服务器的配置进行完整分组。
Link到正式MySQL文档,其中解释了完整的GROUP BY

kr98yfug

kr98yfug3#

更安全的方法不是禁用strict('strict' => false),而是向config传递一个数组,只启用您想要的模式:

// config/database.php
    
    'connections' => [
        //...
        'mysql' => [
            //...
            'strict'      => true,
            'modes'       => [
                //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
                'STRICT_TRANS_TABLES',
                'NO_ZERO_IN_DATE',
                'NO_ZERO_DATE',
                'ERROR_FOR_DIVISION_BY_ZERO',
                //'NO_AUTO_CREATE_USER', // This has been deprecated and will throw an error in mysql v8
                'NO_ENGINE_SUBSTITUTION',
            ],
        ],
    ],

如果更改设置后仍然出现相同的错误,请尝试运行php artisan config:cache来清除配置缓存

wqsoz72f

wqsoz72f4#

  • 转到配置文件/数据库.php*
  • 将严格值更新为false。*
return [
   'connections' => [
      'mysql' => [
         'strict' => false
       ]
   ]
]
xkrw2x1b

xkrw2x1b5#

您可以在查询之前定义这一行,假设您要使用groupBy,因此无需将config strict更改为false,只需在使用groupBy的位置之前添加这一行:

\DB::statement("SET SQL_MODE=''");//this is the trick use it just before your query where you have used group by. Note: make sure your query is correct.

//this is just an example code.

$Rspatients = DB::table('reports')
->select(
    DB::raw("day(created_at) as day"),
    DB::raw("Count(*) as total_patients"))

->orderBy("created_at")
->groupBy(DB::raw("day(created_at)"))
->get();
jbose2ul

jbose2ul6#

我的公司使用原始SQL来运行group by,而不必冒险更改mysql设置。
下面是一个工作示例:

public static function getPositivesDaily($start_date, $end_date, $admin_id)
{
    $positives = DB::select(
        'select COUNT(inspections.id) as total,DATE_FORMAT(inspections.created_at, :format) as date
            from inspections
            where inspections.created_at between :start_date and :end_date
            and inspection_results = 1
            and admin_id = :admin_id
            GROUP BY date',
    ['format'=>'%Y-%m-%d', 'start_date'=>$start_date, 'end_date'=> $end_date, 'admin_id'=>$admin_id]
    );

    return $positives;
}

问我任何关于这个代码,如果你不明白,我会尽快回复我可以。干杯。

2hh7jdfx

2hh7jdfx7#

有很多方法可以解决这个问题

第一

只获取分组所依据的列,在本例中为category_id。

    • 注意:**select中的列必须存在于groupBy中,反之亦然。
$posts = Post::query()
    ->select('category_id')
    ->groupBy('category_id')
    ->get();

| 类别标识|
| - ------|
| 1个|
| 第二章|

2

但我想要所有列!

好的,如果你想得到所有的列,那么诀窍就是不要在数据库级别使用groupBy(),而可以在返回的集合中使用它。
x一个一个一个一个x一个一个二个x

3

在Laravel中,可以通过在database.php配置文件中将其设置为false来简单地禁用"严格模式"。虽然可能,但我不建议这样做。最好花时间学习如何编写正确的SQL查询,因为关闭"严格模式"所给出的结果可能是不可预测的,并导致未来的问题。

参考

https://sinnbeck.dev/posts/laravel-groupby-error

hsvhsicv

hsvhsicv8#

编辑应用程序的数据库配置文件config/database.php
在mysql数组中,设置strict =〉false禁用MySQL的strict mod

浏览器/etc/mysql/mysql.cnf
[mysqld] sql_mode =无零输入日期、无零日期、按零划分错误、无自动创建用户、无引擎替换

goucqfw6

goucqfw69#

如果您设置为false strict mode,则无法使用其他strict函数来修复此错误请转到Illuminate\Database\Connectors\MySqlConnector.php并按如下所示更改函数:

protected function strictMode() {
return "set session
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY
_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'";
}

用这个替换函数。

相关问题