Laravelに限らずRDBでツリー構造を扱う方法はいくつかありますが、入れ子集合モデル(Nested Sets Model)が有効なようです。 Laravel NestedSetとBaumが有名所のようですが、Baumは2015年からメンテされていないようなので、Laravel NestedSetが選択肢になりそうです。 インストール †Composerにてインストールします。 $ composer require kalnoy/nestedset vendor/kalnoy/nestedset/ 以下にインストールされます。 テーブルの作成 †良く使われそうなカテゴリーを例として作成します。 $ php artisan make:migration create_categories_table database/migrations/ 以下にファイルが生成されるので、こちらを編集します。 <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use Kalnoy\Nestedset\NestedSet; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name', 32); NestedSet::columns($table); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('categories'); } } $ php artisan migrate モデルの作成 †$ php artisan make:model Models/Category <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Kalnoy\Nestedset\NodeTrait; class Category extends Model { use NodeTrait; protected $fillable = [ 'name', ]; } テスト用データの作成 †$ php artisan make:seeder CategoriesTableSeeder database/seeds/ 以下にファイルが生成されます。 <?php use Illuminate\Database\Seeder; use App\Models\Category; class CategoriesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $Category = new Category(); $Category->create(['name' => 'インテリア']); $parent = $Category->create(['name' => 'キッチンツール']); $parent->children()->create(['name' => '調理器具']); $child_parent = $parent->children()->create(['name' => '食器']); $child_parent->children()->create(['name' => 'フォーク']); $Category->create(['name' => '新入荷']); } } $ php artisan make:seeder CategoriesTableSeeder コントローラーの作成 †$ php artisan make:controller CategoryController <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\Category; class CategoryController extends Controller { public function index() { $categories = Category::get()->toTree(); return view('category', compact('categories')); } } ビューの作成 †@foreach ($categories as $category) <div class="col-md-12"> <h3>{{ $category->name }}</h3> <hr> <div class="row"> @foreach ($category->children as $cats) <div class="col-md-4"> <h4>{{ $cats->name }}</h4> <hr> @foreach ($cats->children as $cat) <h5>{{$cat->name}}</h5> @endforeach </div> @endforeach </div> </div> @endforeach |