One to One
AddressテーブルとUserテーブルにOne to Oneのリレーションを作る
AddressModel
public function user(){
return $this->belongsTo("App\User","user_id","id");
//2つ目と3つ目の引数は省略可
}
2つ目と3つ目は入れなくても、Laravelの規約上、
WHERE addresses.user_id = users.id
みたいなWHERE句を
作ってくれるようだ。
でもってUserモデルにも追加。
UserModel
public function address(){
return $this->hasOne("App\Address","user_id","id");
//
}
こっちはhasOne()
を使い、第二引数はuser_id
にする。
でもってマイグレーションにも追加。
$table->unsignedBigInteger("user_id");
$table->foreign("user_id")->references("id")
->on("users")->onDelete("cascade");
//どれが外部キーか、その外部キーはどのカラムを参照するか、
//どのテーブルを参照するか、デリート時にどうなるかを記述
ちなみにone to oneリレーションのseedingにはちょっとしたコツが要る。
userSeeder
factory(App\User::class, 3)->create()
->each(function($user){
$user->address()
->save(factory(App\Address::class)->make());
});
こうすればUserとAddressの関係がone to oneのシーディングを
行ってくれる。