Laravel 4.2返回BelongsToMany上的软删除结果


Laravel 4.2 returning soft deleted on BelongsToMany results

你好,我刚刚注意到softDelete的一个奇怪行为。基本上,当我查询一组相关的模型时,Eloquent会返回一个集合,其中也包含软删除的行。

我一直在遵循4.2关于softdelete特性使用的指南,只要我获得/delete/restore/强制删除我的模型,我的代码就可以正常工作。这个问题是由关系引发的。

考虑这种情况:我有一个用户模型,它有一个belongToMany友谊关系,其中友谊状态可以被接受/挂起/请求/阻止,如下所示:

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

这个朋友表的行基本上是"向量",其中user1->status->user2和viceversa(user2->status->user 1在另一行)。当用户1决定不再与用户2成为好友时,两个好友行将被软删除。

问题是:当我从控制器中查询DB时,如下所示:

$friends = $user->friends;

即使是软删除的行也会显示在返回的集合中,尽管我本以为这些行会从结果中隐藏起来,除非我使用->withTrashed()。

我怀疑belongsToMany()方法没有考虑透视表上的deleted_at字段。

有人面临过类似的问题吗?我是不是做错了这段关系?

非常感谢你的帮助!!!

我假设您有一个使用SoftDeletingTraitFriend模型。

软删除是模型的一个功能。但是,BelongsToMany关系不需要为透视表定义模型,因此即使模型存在,它也不考虑模型。它与基表一起工作。由于关系不知道任何连接到数据透视表的模型,因此它不知道数据透视表上的软删除。

您当前的解决方案可能不错,但您可能需要考虑使用wherePivot

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

通过这种方式,软删除子句用于任何其他内部关系处理,这些内部关系处理最终会专门为数据透视表构建新的查询(例如sync、detach、updateExistingPivot等)。

添加:

->whereNull('friends.deleted_at')

对于我的模型friends()方法似乎可以很容易地解决我的问题(愚蠢的我几分钟前没有考虑它)。我本希望Eloquent能够正确处理这些软删除的数据透视行。

我仍然怀疑我是否误解了如何使用这些关系。。。