Laravel 外部キー Tinker

外部キー制約

紐づくモデル名+「_id」で外部キーと呼ぶ
shopsテーブルにowner_idを作成しownersテーブルのidと紐付ける

model migration seederの作成

foreignId('owner_id')->constrained();で「紐づくモデル名_id」として指定

<?php
public function up()
    {
        Schema::create('shops', function (Blueprint $table) {
            $table->id();
            //紐づくモデル名_id
            $table->foreignId('owner_id')->constrained();
            $table->string('name');
            $table->text('information');
            $table->string('filename');
            $table->boolean('is_selling');
            $table->timestamps();
        });
    }

DatabaseSeederクラス内で、callメソッドを使用して追加したシードクラスを実行する
\App\Models\User::factory(10)->create();

<?php
public function run()
{
    //DatabaseSeederクラス内で、callメソッドを使用して追加したシードクラスを実行する
    // \App\Models\User::factory(10)->create();
    $this->call([
    AdminSeeder::class,
    OwnerSeeder::class,
    ShopSeeder::class,
   ]);
}
<?php
public function run()
     {
        DB::table('shops')->insert([
            [
                'owner_id' => 1,
                'name' => 'ここに店名がはいります',
                'information' => 'ここにお店の情報が入ります。ここにお店の情報が入ります。ここにお店の情報が入ります。',
                'filename' => '',
                'is_selling' => true
            ],
            [
                'owner_id' => 2,
                'name' => 'ここに店名がはいります',
                'information' => 'ここにお店の情報が入ります。ここにお店の情報が入ります。ここにお店の情報が入ります。',
                'filename' => '',
                'is_selling' => true
            ],
        ]);
    }

$ php artisan migrate:refresh --seed
ロールバックで全てのテーブルが削除され、migrateされたあとにseederが実行

Laravel Tinker リレーション
  • リレーションをつける
    1つのownerが1つのshopをもつ(1対1)
    →1つのshopが複数の商品をもつとかテーブル同士がつながっていて、それぞれのデータを扱いやすくする仕組み
    hasOne(相手先のエロクアント)とすると1対1の関係になる。
    メソッドとエロクアントモデル名は同じにする。
<?php
use App\Models\Shop;

public function shop()
{
  return $this->hasOne(Shop::class);
}
  • 逆の関係の定義 Owner→Shopではなく、Shop→Ownerの場合はbelongsToを使う
<?php
use App\Models\Owner;

public function owner()
{
  return $this->belongsTo(Owner::class);
}
Tinkerでみていく

Tinkerを使えば直接DBにアクセスしてリレーションを確認できる