今天要將article和user牽上線,但在實作前我們先來看Laravel要如何幫兩個有緣人搭上關係,所以今天的主旨是Model的 1 to 1 和 1 to n 介紹,同時實作article和user的關係。
在一對一的情況,我們假設一個人會有一個電話號碼,而每個電話號碼會有一個主人,在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);
}
到這裡一對一的雙向關係就建立完了,讓我們進入下一個小節。
接下來就不舉例了,親自上手實做我們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
把表放進我們的資料庫了。
看到這希望你曾經好奇過,好像少了多對多的關聯,在這30天的LL地獄導覽,多對多的關係被安排在了不遠的未來,讓我們滿懷期待地等到那天到來,同時也可以期待明天的介紹,我們終於要前進前端的blade,讓我們重新認識那位最熟悉的陌生人。