資料表A的主鍵可以在資料表B取得一筆資料,而資料表B的資料也只會對應資料表A的一筆資料而已。
舉個例子:我有一個身分證。
$this->hasOne(Phone::class, 'foreign_key');
$$this->belongsTo(User::class, 'foreign_key', 'owner_key');
資料表A的主鍵可以在資料表B取得多筆資料,而資料表B的資料只會對應資料表A的一筆資料而已。
舉個例子:隨身物品。我有這些東西,這些東西屬於我。
this->hasMany(Comment::class, 'foreign_key', 'local_key');
return $this->belongsTo(User::class)->withDefault(); //如果沒資料回傳null
$this->belongsTo(User::class)->withDefault(['name' => 'Guest Author']);
$this->belongsTo(User::class)->withDefault(function ($user, $post) {$user->name = 'Guest Author';});
Post::whereBelongsTo($user)->get();
Post::whereBelongsTo($user, 'author')->get();
$this->hasOne(Order::class)->latestOfMany();
$this->hasOne(Order::class)->oldestOfMany();
$this->hasOne(Order::class)->ofMany('price', 'max');
$this->hasOneThrough(Owner::class, Car::class);
$this->hasManyThrough(Deployment::class, Environment::class);
資料表A的主鍵可以在資料表B找到多筆資料,且用資料表B的主鍵可以在資料表A找到多筆資料,他們當中需要intermediate table(或稱joining table)用來記錄兩張表間資料的關係,這張joining table裡面只會儲存A表可當為主鍵的一個欄位資料和B表可當為主鍵的一個欄位資料,這張表的目的除了是多對多的規範外,也是為了讓設計者可以減輕設計太過複雜的資料表結構所造成的痛苦。
舉個例子:訂單綁商品
$this->belongsToMany(Role::class);
$this->belongsToMany(Role::class, 'role_user');
$this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
資料來源:https://docs.cornch.dev/zh-tw/laravel/9.x/eloquent-relationships#one-to-one