MySQL8.0 の再帰クエリを単独の Eloquent で使ってみる

ちょうどやりたいことができそうだったので、 MySQL8.0 で新しく追加された再帰クエリを使ってみました。なお、単独インストールした Eloquent での使用を想定しているので、リレーションの機能をそのまま使うのは難しそうなケースでした。

経緯

内容としてはありがちな部署マスタのようなもので、親子関係まで見たいと考えたためでした。

idparentname
10営業部
21営業1課
31営業2課
40システム部
54開発課
64運用保守課
75フロントエンドグループ
85バックエンドグループ

イメージとしてはこんなイメージのテーブルがあったとして、例えば「システム部」と指定した場合、「開発課」「運用保守課」「フロントエンドグループ」「バックエンドグループ」のIDを子部署として参照したい、というようなケースです。

コード

$hogeObjectsArray = $this->dbConnect->connection('hogera')
                                ->select("
                                    WITH recursive child(
                                        depth,
                                        id,
                                        parent,
                                        name
                                      ) AS (
                                        SELECT 0,
                                               id,
                                               parent,
                                               name
                                          FROM hoge
                                         WHERE id = {$foo}
                                         UNION ALL
                                        SELECT child.depth + 1,
                                               hoge.id,
                                               hoge.parent,
                                               hoge.name
                                          FROM hoge, child
                                         WHERE hoge.parent = child.id
                                      )
                                      SELECT depth,
                                             id,
                                             parent,
                                             name
                                        FROM child
                                       ORDER BY
                                             depth
                                ");

最終的には上述の形で取得できました。

->table($this->table) 等でテーブルを指定せず、いきなり ->select() しているのがミソです。

参考

with recursive

単独の Eloquent 内で with recursive を使用したい

メソッド確認

unionAll

(未使用) 外部パッケージ

(未使用) もはや生PDOに回帰するか

whereIn()

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。