1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CakePHP4 のクエリビルダで実装されていないMySQL関数はマジックメソッドでそのまま実行される

Last updated at Posted at 2020-11-29

[MySQL][CakePHP4] GROUP_CONCAT でカラム値を連結したい&group_concat_max_len システム変数
の続きです。

結論

  • 2020年11月29日時点で CakePHP4 には GROUP_CONCAT 関数は実装されていない
  • マジックメソッドによりMySQL の関数を直接実行するので group_concat と書けば動く
  • postgreSQL, SQL Server, SQLite に対し、機能追加の PR が出ているがまだマージされていない
  • よって、MySQL 以外はまだ使えない
  • マージされたら RDBMS の種類関係なくキャメルケースの groupConcat として使える

GROUP_CONCAT の PR

@ktouさんが調べてくださった CakePHP4 の GROUP_CONCAT の PR を読んでいて、なるほど MySQL はおそらくそのまま関数を実行していて、他のRDBMS では実行できないから PR 出されているんだな、と理解はしてたのですが、実際のコードと動きから実証したわけではありませんでした。
が、なんと引き続き調べてくださっていました。圧倒的感謝…
よって流れをまとめさせていただきます。

僕も疑問だったんですが、軽く CakePHP4 本体のコードを追っていたら、CakePHP4 自体に存在しない関数はそのまま MySQL の関数を呼んでそう…と予測するところで考えるのをやめてしまってました。

そうしたら、なんと引き続きコードを追ってくださっていて…なんかもう僕がコードを追わせてしまった感じになっていて申し訳ない限りなのですが、これはもう感謝しかないということで Qiita に投稿している次第です。TL に埋もれさせてはいかん。

該当のコードを引用します。

    /**
     * Magic method dispatcher to create custom SQL function calls
     *
     * @param string $name the SQL function name to construct
     * @param array $args list with up to 3 arguments, first one being an array with
     * parameters for the SQL function, the second one a list of types to bind to those
     * params, and the third one the return type of the function
     * @return \Cake\Database\Expression\FunctionExpression
     */
    public function __call(string $name, array $args): FunctionExpression
    {
        return new FunctionExpression($name, ...$args);
    }

なるほど…CakePHP4 にない関数が呼ばれた場合はマジックメソッドで処理されるんですね。そしてたまたま group_concat とスネークケースで書いていたので、MySQL と同じ関数だったので実行できていた、ということでした。

また、PR がマージされたら、 groupConcat とキャメルケースで呼び出すのが正しい実装となると思います。

今後

上記の PR がマージされたら、改めて動作検証した結果を反映します。

感謝

Twitterで軽い気持ちでわからないことを呟いたら、あれよあれよと言う間にすごい人たちがリプをくださり、検証してくださって、本当に感謝しかないです。
僕にとって、Twitterって世界はほんといつもいい刺激とインプットがもらえる最高の場所だし、最高な人がたくさんいて最高だなって語彙を失うレベルで日々みています。

僕も最高だなって思ってもらえるよう今後も活動していかねばって思わせていただいてます。
本当にいつも感謝です!ありがとうございますm(__)m

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?