Laravel 4.2在BelongsToMany查询结果中返回已软删除的数据

6

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

我一直遵循4.2指南中关于使用Traits进行软删除的用法,并且只要获取/删除/恢复/强制删除我的模型,我的代码就能正常工作。但问题是与关系有关。

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

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

这个朋友表中的行基本上是“向量”,其中user1->状态->user2,反之亦然(user2->状态->user1在另一行中)。 当user1决定不再与user2交朋友时,这两个朋友行被软删除。
问题在于:当我像这样从控制器查询数据库时:
$friends = $user->friends;

即使软删除的行应该被隐藏,但它们仍然出现在返回的集合中,除非我使用 ->withTrashed()。
我怀疑 belongsToMany() 方法没有考虑到关系表上的 deleted_at 字段。
有人遇到类似的问题吗?我在这个关系中做错了什么吗?
非常感谢您的帮助!
2个回答

5
我假设您有一个使用了SoftDeletingTrait的Friend模型。
软删除是模型的功能。然而,BelongsToMany关系并不需要为中间表定义模型,因此即使存在模型,它也不会考虑模型。它与基础表一起工作。由于关系不知道连接到中间表的任何模型,因此它不知道中间表上的软删除。
您目前的解决方案可能没问题,但您可能需要考虑改用wherePivot。
->wherePivot('deleted_at', null)
// or
->wherePivot(Friend::getDeletedAtColumn(), null)

这样做,软删除子句用于任何其他内部关系处理,最终会为数据透视表构建新的查询(例如,同步、分离、updateExistingPivot等)。

看起来非常有前途。我一有机会就会试试看。非常好的发现! - Federico Stango

3

添加:

->whereNull('friends.deleted_at')

对于我的模型朋友来说,使用()方法似乎可以轻松解决我的问题(愚蠢的我几分钟前没有想到)。我本来以为Eloquent能够正确处理这些软删除的关联行。

不过,我还是在想我是否误解了如何使用这些关联...


这是对我有效的方法。谢谢。现在,我在用户模型中有一个函数: public function teams() { return $this->belongsToMany('App\LinkageTeam', 'linkage_team_users', 'user_id', 'team_id')->wherePivot('deleted_at', null); }它不再返回已删除的行。 - liamvictor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接