一對一
$this->hasOne(關聯模型的類名, 關聯模型的外來鍵, 當前模型的主鍵);
如(使用者擁有的那個手機):
public function phone()
{
return $this->hasOne(Phone::class, 'user_id', 'id');
}
反向關聯
文件中提到的父級物件模型=這裡的關聯模型
$this->belongsTo(關聯模型的類名, 當前模型的外來鍵, 關聯模型的主鍵);
如(擁有這個手機的使用者):
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
一對多
模型方法引數和一對一一致
$this->hasMany(關聯模型的類名, 關聯模型的外來鍵, 當前模型主鍵);
如(一篇文章擁有多次評論):
public function comments()
{
return $this->hasMany(Comment::class, 'article_id', 'id');
}
多對多
$this->belongsToMany(關聯的模型類名, 中間表表名,
當前模型在中間模型中的外來鍵名稱, 關聯模型在中間模型的外來鍵名稱);
如(使用者擁有的所有角色):
public function roles() {
return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
}
遠層一對多
$this->hasManyThrough(
最終訪問的模型類名, 中間模型的類名,
中間模型的外來鍵名稱, 最終模型的外來鍵名稱, 當前模型的主鍵
);
如(一個國家有很多使用者,使用者又可以釋出多篇文章,獲取某國家所有使用者釋出的多有文章):
public function articles() {
return $this->hasManyThrough(Article::class, User::class, 'country_id', 'user_id', 'id');
}
多型關聯
$this->morphMany(中間模型類名,
中間表來源欄位字首, 中間模型型別欄位,
中間模型來源欄位, 當前模型的主鍵);
如(文章和使用者都可以別點贊,根據點贊記錄Follow獲取來源):
aticles
id - integer
title - string
users
id - integer
name - string
follows
id - integer
source_id - integer
source_type - string
class Follow extends Model
{
// 方式一
public function source()
{
return $this->morphTo(); // 中間表字首會使用模型方法名source,得到中間表型別欄位source_type和中間表來源欄位source_id
}
// 方式二
public function comment()
{
return $this->morphTo('source'); // 即使模型方法名不正確,可以使用正確的中間表字首source,同樣得到正確結果
// 和以下方式結果一致
// return $this->morphTo('comment', 'source_type', 'source_id'); // 即使中間表字首名稱不正確,只要指定正確的中間表型別欄位和中間表來源欄位,同樣可以得到正確的結果
}
}
定義主鍵和外來鍵主要是為了維護關聯式資料庫的完整性,總結一下:
1.主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份證號,姓名,年齡。
身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。
2.外來鍵用於與另一張表的關聯。是能確定另一張表記錄的欄位。
如:id是users的主鍵,country_id可以確定countries表的一條記錄,是users的外來鍵
countries
id - integer
name - string
users
id - integer
country_id - integer
name - string
本作品採用《CC 協議》,轉載必須註明作者和本文連結