2022-07-12に投稿

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

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

経緯

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

id parent name
1 0 営業部
2 1 営業1課
3 1 営業2課
4 0 システム部
5 4 開発課
6 4 運用保守課
7 5 フロントエンドグループ
8 5 バックエンドグループ

イメージとしてはこんなイメージのテーブルがあったとして、例えば「システム部」と指定した場合、「開発課」「運用保守課」「フロントエンドグループ」「バックエンドグループ」の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()

Originally published at labor.ewigleere.net
ツイッターでシェア
みんなに共有、忘れないようにメモ

arm-band

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

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント