nanisore oishisou

Webエンジニアあるまさんのゆるふわ奮闘記。

Laravelでgroup byしたら、"~ isn't in GROUP BY (~)"って怒られました

group byしたら、うちのMariaさんが
「selectで設定した全カラムをgroup byに入れなさいよ!言わせんな恥ずかしい!!」
という、ヒステリックなことを言ってきた。
あ、これ、どれ選べばいいのか分からないから勝手にマージして表示してやんぜ、というmysqlの優しさが失われているやつや。。
そんな設定した覚えないのに、なんで。。。

おいらの環境

config/database.php

strict = true

この環境で、ONLY_FULL_GROUP_BYがsqlのmodeとして追加されてしまうみたい。

これはLaravel側で設定してしまうようで、私のMariaDBではmodeとして追加はされてはいなかった。

f:id:arm4:20190111181301p:plain
ONLY_FULL_GROUP_BYは設定されてないYODA

以下にissueが上がっていた。

github.com

原因はstrict = trueのようだ。

strict = falseにすれば、確かにヒステリックなことは言わなくなりMariaさんは優しさを取り戻してくれる。

しかし、マージされてしまっていて特に使わないカラムを取得する意味もないし、
ヒステリックなMariaさんも、私は何気に嫌いでもない。

true時に適用されてしまう項目は以下のようなので、

  • ONLY_FULL_GROUP_BY
  • STRICT_TRANS_TABLES
  • NO_ZERO_IN_DATE
  • NO_ZERO_DATE
  • ERROR_FOR_DIVISION_BY_ZERO
  • NO_AUTO_CREATE_USER
  • NO_ENGINE_SUBSTITUTION

現状の差分的には以下が追加で設定されてしまうということだ。

  • ONLY_FULL_GROUP_BY
  • NO_ZERO_IN_DATE
  • NO_ZERO_DATE

うーん。

正直falseでもいいような気がするが、アプリ側でそんなん絶許!!してくれるというのは、考えようによってはいいのかもしれない。

一部のみを適用したい場合はissueにあるとおり、config/database.phpmysqlの設定にmodesを追加して、適用したいmodeのみを記載すればいい。

ONLY_FULL_GROUP_BYだけをオフりたい場合は、↓以下。
分かりやすくコメントアウトにしてあげました。(優しさ)

config/database.php

            'strict' => true,
            'modes'  => [
                // 'ONLY_FULL_GROUP_BY',
                'STRICT_TRANS_TABLES',
                'NO_ZERO_IN_DATE',
                'NO_ZERO_DATE',
                'ERROR_FOR_DIVISION_BY_ZERO',
                'NO_ENGINE_SUBSTITUTION',
            ],

ちなみにONLY_FULL_GROUP_BYをオフらなくても怒られなくするには、
以下の記事を参考にそれぞれのカラムでどの値を持ってくるか指定してやればいいようだ。

mashup.hatenablog.com

え、超めんどくさい。。。。
おとなしくオフしたい。

末永いお付き合いをするには、優しさも大事なときが来るかもしれないが
ひとまずヒステリックになったのは、きっと何か嫌な出来事があったからだと思うので
大人しく過敏になったLaravelさんとお付き合いを続けることにした。

まあでも、今回はテストで*で書いて気づいたけど、
ちゃんと書き込むときはマージされるカラムなんかselectしない気もする。

教えてくれて親切だけど、
怒られるとビックリして、それの原因突き止めるのに時間かかったりして
なんかちょっとしたトラップ設定のような気もするし
こんなんオフればいいやんって気もする。

ただ何度も言うが、
これをデフォルト設定にしたのには何か嫌な出来事があったからかもしれないので
このストイックさを優しく受け止めてあげる男っぷりを私たちは試されているのかもしれない。
そんなわけないか。

新年一発目のブログでしたーーー!!!!