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でリレーションの確認