バックエンドとフロントエンドを行き来するWEBプログラマ―のメモ帳

WEBプログラマ―。バックエンドはPHP, MySQL, CentOS系, フロントエンドはJavaScript, jQuery, HTML, CSSで仕事してます。

LaravelでGROUP BY clause and contains nonaggregated columnと出たとき

問題のSQL

<?php
$photos = Photo::
join ~省略~
->select('photos.*')
->groupBy('photos.id')

と、した時に
GROUP BY clause and contains nonaggregated column
は出現しました。

環境

Laravel 5.8
MySQL 8.0
PHP 7.2

原因

これはMySQL5.7からONLY_FULL_GROUP_BYがデフォルトで有効になっているためです。
qiita.com
元記事より引用

GROUP BYを使っていると、非集約カラムをSELECTで参照できなくなります。
つまりGROUP BY使っている場合はSELECTするものを全部GROUP BYに書け、とのことです。

そこで、/etc/my.cnfを編集していきたいところですが、
エラーが消えないなどハマってしまったためメモします。

解決

[mysqld]直下にsql_modeを書く!(重要)

手順

my.cnfの場所を探します

sudo find / -type f -ls  | fgrep my.cnf

4 -rw-r--r--   1 root     root         1352 Jun 26 20:18 /etc/my.cnf

と出たので、/etc/my.cnfにありますね!

sudo vi /etc/my.cnf
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#
# Remove leading # and set to the amount of RAM for the most important data

my.cnfの一番下に書いてもなぜか反映されなかった。

保存して、mysqlサーバーを再起動する。

sudo systemctl restart mysqld

mysqlコンソールにて、ONLY_FULL_GROUP_BYが消えていることを確認します。

mysql> SELECT @@global.sql_mode;
+----------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                  |
+----------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

ONLY_FULL_GROUP_BYが消えていますので、WEBサイトにアクセスします。
すると、エラーGROUP BY clause and contains nonaggregated columnが消えました。