Laravel – Eloquent 에서 group by 에러가 발생할때 > IT 기술백서

라라벨에서 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]

세번째 방법이 가장 정석인거 같긴한데 번거럽긴하다.

 

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤