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

Fed*_*ngo 6 php laravel eloquent

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

我一直在遵循有关软删除特征使用的 4.2 指南,只要我获取/删除/恢复/强制删除我的模型,我的代码就可以正常工作。这个问题是由关系引发的。

考虑这种情况:我有一个具有BelongToMany友谊关系的用户模型,其中友谊状态可以被接受/待处理/请求/阻止,如下所示:

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

这个朋友表行基本上是“向量”,其中 user1->status->user2 ,反之亦然(user2->status->user1 在另一行)。当 user1 决定不再与 user2 成为好友时,这 2 个好友行将被软删除。

问题是:当我像这样从控制器查询数据库时:

$friends = $user->friends;
Run Code Online (Sandbox Code Playgroud)

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

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

有人遇到过类似的问题吗?我在这段关系中做错了什么吗?

非常感谢你的帮助!!!

pat*_*cus 5

我假设您有一个Friend使用SoftDeletingTrait.

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

您当前的解决方案可能没问题,但您可能需要考虑使用wherePivot

->wherePivot('deleted_at', null)
// or
->wherePivot(Friend::getDeletedAtColumn(), null)
Run Code Online (Sandbox Code Playgroud)

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


Fed*_*ngo 3

添加:

->whereNull('friends.deleted_at')
Run Code Online (Sandbox Code Playgroud)

对于我的模型 Friends() 方法似乎很容易解决我的问题(愚蠢的我没有提前几分钟考虑它)。我本希望 Eloquent 能够正确处理这些软删除的枢轴行。

我仍然想知道我是否误解了如何使用这些关系......