Laravel Seeder複数テーブル書く方法

primary_categoriesテーブルとsecondary_categoriesテーブルを作成。


どちらも関係のあるカテゴリーなので1つのマイグレーションファイルに書いていくので1つだけ作成。

primary_categoriesは複数のカテゴリーをもつので1対多の関係になる。

php artisan make:model PrimaryCategory -m
php artisan make:model SecondaryCategory


PrimaryCategoryモデル
 <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use APP\Models\SecondaryCategory;

class PrimaryCategory extends Model
{
    use HasFactory;

    public function secondary()
    {
        //primaryは複数のcategoryをもてるのでhasManyとする
        return $this->hasMany(SecondaryCategory::class);
    }
}
SecondaryCategoryモデル
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use APP\Models\PrimaryCategory;

class SecondaryCategory extends Model
{
    use HasFactory;

    public function primary()
    {
        //primaryに属する
        return $this->belongsTo(PrimaryCategory::class);
    }
}
マイグレーションファイル

2つのテーブルを記載
※secondaryテーブルから先に削除しないと外部キーエラーになる。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoriesTable extends Migration
{
    public function up()
    {   //schema::create('テーブル名')
        Schema::create('primary_categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('sort_order');
            $table->timestamps();
        });

        Schema::create('secondary_categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('sort_order');
            //外部キーFK設定
            $table->foreignId('primary_category_id')->constrained();
            $table->timestamps();
        });
    }

    public function down()
    {
        //migate:refreshなどのコードでテーブルを削除する処理を書く
        //secondaryテーブルから先に削除しないと外部キーエラーになるので注意
        Schema::dropIfExists('secondary_categories');
        Schema::dropIfExists('primary_categories');
    }
}
Seeder作成


DatabasesSeederに記載→CategorySeeder::class,

楽天のカテゴリーを参考にSeederを作成。2つのテーブルを書いていく。

CategorySeeder.php

migrate

Tinkerでリレーションの確認