laravel-nestedsetを使ってLaravel10で階層構造のカテゴリを作る

Laravel,MySQL,PHP

laravel-nestedsetとは?

カテゴリの様な、ツリー上の階層データを手軽に扱うためのライブラリパッケージです

公式Github

環境

Laravel 10

PHP v8.2.13

MySQL v5.7

準備

インストール

composer require kalnoy/nestedset

まずはパッケージをcomposerを使ってインストールします

use Kalnoy\Nestedset\NodeTrait; // <- これ

class Category extends Model {
    use NodeTrait; // <- これ
}

あとは利用するモデルに2行つけたします(上は例としてCategoryテーブルに追加する場合)

DB

手順書通りマイグレーションするのが正しいと思いますが、

既に作成済みのテーブルに対しての追加だったこともあり、面倒なので直接テーブルに以下のカラムを追加しました

名前タイプ属性NULLデフォルト値
_lftint(10)UNSIGNEDいいえなし
_rgtint(10)UNSIGNEDいいえなし
parent_idint(10)UNSIGNEDはいNULL

_lft・_rgtの値をセット

DBテーブル上で追加したカラム_lft/_rgtに値を入力するために、コマンドを打つ必要があります

$ php artisan tinker

> App\Models\Category::fixTree();
= 123

これで準備は完了です

使い方

ツリー一覧を取得

// カテゴリ一覧を取得
$categoryTree = Category::get()->toTree();

// 配列型で出力も可能
$categoryTree->toArray();

toArray()してやることで配列型でも出力可能ですが、専用の便利なメソッドが使えるのでtoTree()の返却値をそのまま使ったほうが良さそうです

葉(子供がいるかどうか)を判定

@foreach ( $categoryTree as $parent )
  $parent->isLeaf(); // 子供がおらず、葉の場合はtrue。子供がいる場合はfalse。
@endforeach

子供の配列を取得

@foreach ( $categoryTree as $parent )
  @foreach ($parent->children as $branch)
    {{ $branch->name }}
  @endforeach
@endforeach