模型關聯使用總結

haibin_hu發表於2018-09-17

一對一

$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 協議》,轉載必須註明作者和本文連結

相關文章