2015-02-08 122 views
1

你好,我剛剛注意到softDelete的一個奇怪的行爲。基本上,當我查詢一組相關模型時,Eloquent返回一個集合,其中也包含軟刪除的行。Laravel 4.2返回軟刪除BelongsToMany結果

我一直在關注softdelete的特性使用方面的4.2指南,我的代碼工作得很好,只要我得到/刪除/恢復/強制刪除我的模型。這個問題是由關係觸發的。

考慮這種情況: 我有了一個belongToMany友誼關係下的友誼狀態可以接受/待處理/申請/受阻如下用戶模型:

public function friends() { 
    return $this->belongsToMany('User', 'friends', 'user_id', 'friend_id')->where('status', 'accepted'); 
} 

該朋友錶行基本上是「向量「,其中user1-> status-> user2,反之亦然(user2-> status-> user1位於另一行)。 當user1決定不再與user2交朋友時,2個好友行被軟刪除。

這裏的問題:當我從控制器這樣的查詢數據庫:

$friends = $user->friends; 

甚至softdeleted行返回集合中顯示出來,即使我本來期望這些從結果中隱藏,除非我用 - > withTrashed()。

我懷疑belongsToMany()方法沒有考慮數據透視表上的deleted_at字段。

有沒有人遇到過類似的問題?我在做這個關係有問題嗎?

非常感謝您的幫助!

回答

1

添加:

->whereNull('friends.deleted_at') 

我的機型的朋友()方法似乎很容易地解決我的問題(我傻了不去想它一個幾分鐘前)。我希望Eloquent能夠正確處理這些軟刪除的樞軸行。

不過我不知道如果我誤解了如何使用這些關係......

1

我假設你有一個使用SoftDeletingTrait一個Friend模型。

軟刪除是模型的一個功能。但是,BelongsToMany關係不需要爲數據透視表定義模型,因此即使它存在,也不會考慮模型。它適用於基表。由於關係不知道任何連接到數據透視表的模型,它不知道數據透視表上的軟刪除。

您當前的解決方案可以很好,但你可能要考慮使用wherePivot代替:

->wherePivot('deleted_at', null) 
// or 
->wherePivot(Friend::getDeletedAtColumn(), null) 

這樣,軟刪除子句用於該結束了專門建立新的查詢任何其他內部關係的處理數據透視表(例如sync,detach,updateExistingPivot等)。

+0

看起來很有希望。一有機會,我會盡快嘗試。非常好的發現! – 2015-02-14 17:59:46