使用樞紐表

2018-02-24 15:52 更新

如您所知,要操作多對多關(guān)聯(lián)需要一個(gè)中間的數(shù)據(jù)庫表。 Eloquent 提供了一些有用的方法可以和這張表互動。例如,假設(shè) User 對象關(guān)聯(lián)到很多 Role 對象。取出這些關(guān)聯(lián)對象時(shí),我們可以在關(guān)聯(lián)模型上取得 pivot 數(shù)據(jù)庫表的數(shù)據(jù):

$user = User::find(1);
foreach ($user->roles as $role)
{
    echo $role->pivot->created_at;
}

注意我們?nèi)〕龅拿總€(gè) Role 模型對象會自動給一個(gè) pivot 屬性。這屬性包含了樞紐表的模型數(shù)據(jù),可以像一般的 Eloquent 模型一樣使用。

默認(rèn) pivot 對象只會有關(guān)聯(lián)鍵的屬性。如果您想讓 pivot 可以包含其他樞紐表的字段,可以在定義關(guān)聯(lián)方法時(shí)指定那些字段:

return $this->belongsToMany('App\Role')->withPivot('foo', 'bar');

現(xiàn)在可以在 Role 模型的 pivot 對象上取得 foo 和 bar 屬性了。

如果您想要可以自動維護(hù)樞紐表的 created_at 和 updated_at 時(shí)間戳,在定義關(guān)聯(lián)方法時(shí)加上 withTimestamps 方法:

return $this->belongsToMany('App\Role')->withTimestamps();

刪除樞紐表的關(guān)聯(lián)數(shù)據(jù)

要?jiǎng)h除模型在樞紐表的所有關(guān)聯(lián)數(shù)據(jù),可以使用 detach 方法:

User::find(1)->roles()->detach();

注意,如上的操作不會移除 roles 數(shù)據(jù)庫表里面的數(shù)據(jù),只會移除樞紐表里的關(guān)聯(lián)數(shù)據(jù)。

更新樞紐表的數(shù)據(jù)

有時(shí)您只想更新樞紐表的數(shù)據(jù),而沒有要移除關(guān)聯(lián)。如果您想更新樞紐表,可以像下面的例子使用 updateExistingPivot 方法:

User::find(1)->roles()->updateExistingPivot($roleId, $attributes);

自定義樞紐模型

Laravel 允許您自定義樞紐模型。要自定義模型,首先要建立一個(gè)繼承 Eloquent 的「基本」模型類。在其他的 Eloquent 模型繼承這個(gè)自定義的基本類,而不是默認(rèn)的 Eloquent 。在基本模型類里,加入下面的方法返回自定義的樞紐模型實(shí)例:

public function newPivot(Model $parent, array $attributes, $table, $exists)
{
    return new YourCustomPivot($parent, $attributes, $table, $exists);
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號