Laravelめも

Laravelに限らずRDBでツリー構造を扱う方法はいくつかありますが、入れ子集合モデル(Nested Sets Model)⁠が有効なようです。
CakePHPでもTreeBehaviorとして実装されています。

Laravel NestedSetBaumが有名所のようですが、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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-09-19 (日) 19:09:24