iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Modern Web

Laravel實作 —系列 第 10

[Day 10] Laravel實作 -- 閻羅王用relationship找到了我所有值得下地獄的事

  • 分享至 

  • xImage
  •  

今天要將article和user牽上線,但在實作前我們先來看Laravel要如何幫兩個有緣人搭上關係,所以今天的主旨是Model的 1 to 1 和 1 to n 介紹,同時實作article和user的關係。

one to one

在一對一的情況,我們假設一個人會有一個電話號碼,而每個電話號碼會有一個主人,在User的Model裡建立一對一的關係,

use Illuminate\Database\Eloquent\Relations\HasOne;
...

    public function phone(): HasOne
    {
        return $this->hasOne(Phone::class);
    }

關係現在是牽上了,現在我們要在user裡劃一個位置給我們的phone,進入user的migration加上,

$table->foreignId('phone_id')->nullable()->constrained()->cascadeOnDelete();

在foreignId內的名字是有意義的,forignId會到phone找id這項的值,constrained()和forignId一起出現,如果table不叫phone或key叫id,那我們也可以在constrained裡自定義你的key來自哪。最後的cascadeOnDelete則是幫我們檢查如果持有這個電話號碼的使用者被從資料庫移除,那我們的電話號碼也應該被移除。

目前為止,我們完成了單向的關係,可以從使用者查詢到他所持有的電話號碼,那想從電話號碼反向查詢持有的人,我們先前往Phone的Model,

use Illuminate\Database\Eloquent\Relations\BelongsTo;
...

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

到這裡一對一的雙向關係就建立完了,讓我們進入下一個小節。

one to many

接下來就不舉例了,親自上手實做我們article和user的關聯,這將是一個一對多的關係,一個使用者可以有多篇article,但article卻只能有一個作者,接下來打開我們的Laravel,進到app\Models\User.php

use Illuminate\Database\Eloquent\Relations\HasMany;
...

    public function articles(): HasMany
	{
		return $this->hasMany(Article::class);
	}

注意這裡不再是HasOne,因為使用者可以發多篇文章,所以是HasMany,接著再到app\Models\Article.php

use Illuminate\Database\Eloquent\Relations\BelongsTo;
...

    public function user(): belongsTo
	{
        return $this->belongsTo(User::class);
    } 

接著再回我們的migrationdatabase\migrations\2023_09_24_132420_create_articles_table.php,放上foreign id,

$table->foreignId('user_id')->constrained()->cascadeOnDelete();

到這裡我們就完成了article和user的關聯,接著掏出我們偷偷拉的table對照一下,如果對它充滿信心的話,我們這時就可以使用php artisan migrate把表放進我們的資料庫了。
https://ithelp.ithome.com.tw/upload/images/20230925/20163142EG7vBPq0js.png

看到這希望你曾經好奇過,好像少了多對多的關聯,在這30天的LL地獄導覽,多對多的關係被安排在了不遠的未來,讓我們滿懷期待地等到那天到來,同時也可以期待明天的介紹,我們終於要前進前端的blade,讓我們重新認識那位最熟悉的陌生人。


上一篇
[Day 09] Laravel實作 -- 為生死簿建立資料庫
下一篇
[Day 11] Laravel實作 -- 學會了Blade,地獄的門面從今以後我來顧
系列文
Laravel實作 —30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言