라라벨에서 groupBy 를 아래와 같이 했다.
[code]
User::select(‘name’, ‘age’, ‘addr’)->groupBy(‘name’)->get();
[/code]
실행하면 아래와 같은 에러가 발생한다.
‘users.age’ isn’t in GROUP BY (SQL: select name, age, addr from `users` group by `name`)
MySQL 5.7 이후로 only_full_group_by 옵션이 strict 모드에 추가 되어서 발생하는 오류이다.
이를 해결하기 위한 방법은 3가지이다.
먼저 표준에 맞게 groupBy 에 모든 필드를 기술해준다.
[code]
User::select(‘name’, ‘age’, ‘addr’)->groupBy(‘name’, ‘age’, ‘addr’)->get();
[/code]
하지만 너무 번거럽다.
두번째 방법은 strict 모드를 false 로 비활성화 시키는 것이다.
/config/database.php
[code]
connections => [
‘mysql’ => [
….
‘strict’ => false,
]
]
[/code]
이 방법으로 간단하게 해결되지만 다른 필요한 strict 모드도 모두 비활성화 된다.
세번째 방법은 실행하는 순간 only_full_group_by 옵션을 비활성화 해주고 실행후 활성화 해준다.
[code]
// ONLY_FULL_GROUP_BY 비활성화
DB::statement(“SET sql_mode=(SELECT REPLACE(@@sql_mode,’ONLY_FULL_GROUP_BY’,”));”);
// 실행할 sql 문
User::select(‘name’, ‘age’, ‘addr’)->groupBy(‘name’)->get();
// ONLY_FULL_GROUP_BY 활성화
DB::statement(“SET sql_mode=(SELECT CONCAT(@@sql_mode, ‘,ONLY_FULL_GROUP_BY’));”);
[/code]
세번째 방법이 가장 정석인거 같긴한데 번거럽긴하다.