2013-06-27 84 views
13

如何在連接兩種不同類型實體的中間表上設置軟刪除?我已經添加deleted_at列,但該文檔說,我需要把這個納入模型:在多對多關係的中間表上軟刪除

protected $softDelete = true; 

當然,我沒有對中間表的模型。 有什麼想法?

+0

另一種方法是嘗試這種https://github.com/mlezcano1985/laravel-pivot-soft-deletes –

回答

45

你可以把一個約束的貪婪加載:

public function groups() 
    { 

     return $this 
     ->belongsToMany('Group') 
     ->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at` 
     ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at` 

    } 

而不是硬刪除使用關係:

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

你應該使用這樣的事情軟刪除,而不是:

DB::table('group_user') 
    ->where('user_id', $user_id) 
    ->where('group_id', $group_id) 
    ->update(array('deleted_at' => DB::raw('NOW()'))); 
+0

belongsToMany是否在賬戶中使用deleted_at? –

+0

是的。這就是'whereNull('group_user.deleted_at')'的用途。 –

+0

@RonaldHulshof我已經試過這種方式,如何使用'User :: find(1) - > groups() - > detach();' – iatboy

3

據我瞭解;中間表只是將一個表記錄附加到另一個表中的記錄的一段字符串,因此它不需要軟刪除方法。

解釋一下,假設你有一個用戶表和一個組表,每個用戶可以有多個組,每個組可以屬於多個用戶。您的數據透視表可能是User_Group或類似的東西,它只包含兩列user_idgroup_id

User表和Group表應該有軟刪除一個deleted_at列,所以當你「刪除」說了集團,而透視錶行已未受影響該組協會將不會出現在$User->Groups()。如果您然後恢復刪除的組,它將再次出現在$User->Groups()中。

只有當該組記錄被硬刪除時,纔會影響數據透視錶行,在這種情況下,透視行也應該被硬刪除。

現在我已經解釋了爲什麼我不相信你需要將軟刪除添加到數據透視表;你還需要這種行爲嗎?

+2

我需要的是知道用戶是與一組,所以這就是爲什麼我需要軟刪除 - 這個連接仍然在數據庫中,儘管它沒有激活。說得通? – misaizdaleka

+0

啊是的,在這種情況下,你可以在你的數據透視表上添加一個額外的行,例如'deleted_at',然後按照R. Hulshof的回答:) – carbontwelve

3

你也可以使用Laravel的Eloquent BelongsToMany方法updateExistingPivot

$model->relation->updateExistingPivot($relatedId, ['deleted_at' => Carbon\Carbon::now()]); 

因此,要使用@RonaldHulshof示例,您有一個具有屬於belongsToMany關係的組關係的用戶模型。

public function groups() { 
    return $this->belongsToMany(Group::class)->whereNull('groups_users.deleted_at')->withTimestamps(); 
} 

然後,爲了軟刪除數據透視表條目,您可以執行以下操作。

$user->groups->updateExistingPivot($groupId, ['deleted_at' => Carbon\Carbon::now()]);