laravel-nestedsetを使ってLaravel10で階層構造のカテゴリを作る
laravel-nestedsetとは?
カテゴリの様な、ツリー上の階層データを手軽に扱うためのライブラリパッケージです
環境
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 | デフォルト値 |
---|---|---|---|---|
_lft | int(10) | UNSIGNED | いいえ | なし |
_rgt | int(10) | UNSIGNED | いいえ | なし |
parent_id | int(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
ディスカッション
コメント一覧
まだ、コメントがありません
新たにPostされたDocs
: ツール関連
キーボードを銀軸から赤軸に買い替えた話
約3年半前、仕事で使うキーボードとしてARCHISS ProgresTouchの ...: スマホ
楽天モバイルがおすすめできない人の特徴とは?
楽天モバイルの最強プランをおすすめできない人の特徴を簡単にまとめてみました また ...: システム開発
なぜスクラムがつらいのか?開発現場が疲弊するのか?スクラムに対する違和感と共に原因を考えてみた
今ではどこの開発現場に行っても、やれスクラムスクラムと、まるでスクラムでもやって ...: Laravel
1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLara ...: Laravel
Laravelで複数画像アップロード時のvalidateを指定【Laravel10】
jQuery - Image Uploaderを使って、フォームから複数の画像を ...HashMap
created_by
はやぴ
Web/アプリ開発エンジニア
Sierにてお堅いB向けのソフトウェア開発を経て、現在はC向けのWebやアプリを中心に開発しています。
Utilities