iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

學框架永不嫌晚,從現在開始學Laravel你也可以系列 第 12

Day 12 Laravel基礎功 - 資料表的關聯

  • 分享至 

  • xImage
  •  

一對一關係

資料表A的主鍵可以在資料表B取得一筆資料,而資料表B的資料也只會對應資料表A的一筆資料而已。
舉個例子:我有一個身分證。

https://ithelp.ithome.com.tw/upload/images/20220922/20149468OGfedO40YC.png


    $this->hasOne(Phone::class, 'foreign_key');
    $$this->belongsTo(User::class, 'foreign_key', 'owner_key'); 

多對一關係

資料表A的主鍵可以在資料表B取得多筆資料,而資料表B的資料只會對應資料表A的一筆資料而已。
舉個例子:隨身物品。我有這些東西,這些東西屬於我。

https://ithelp.ithome.com.tw/upload/images/20220922/20149468Pqb3OEFI24.png

    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表可當為主鍵的一個欄位資料,這張表的目的除了是多對多的規範外,也是為了讓設計者可以減輕設計太過複雜的資料表結構所造成的痛苦。
舉個例子:訂單綁商品

https://ithelp.ithome.com.tw/upload/images/20220922/20149468VlER1e4MZb.png

    $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


上一篇
Day 11 Laravel基礎功 - Request的生命週期
下一篇
Day 13 Laravel基礎功 - 安全性
系列文
學框架永不嫌晚,從現在開始學Laravel你也可以14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言