ちょうどやりたいことができそうだったので、 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()
しているのがミソです。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント