您好我刚刚注意到softDelete的一个奇怪的行为。基本上,当我查询一组相关模型时,Eloquent返回一个也包含软删除行的集合。
我一直在关注softdelete的traits使用方法的4.2指南,只要我获取/删除/恢复/强制删除我的模型,我的代码就可以正常工作。这个问题是由关系引发的。
考虑这种情况: 我有一个具有belongsToMany友谊关系的用户模型,其友谊状态可以接受/挂起/请求/阻止,如下所示:
public function friends() {
return $this->belongsToMany('User', 'friends', 'user_id', 'friend_id')->where('status', 'accepted');
}
这个朋友表行基本上是" vector"其中user1-> status-> user2和反向(user2-> status-> user1在另一行)。 当user1决定不再与user2成为朋友时,2个朋友行将被软删除。
问题在于:当我从控制器查询数据库时,这样:
$friends = $user->friends;
即使软件删除的行显示在返回的集合中,即使我希望这些行在结果中隐藏,除非我使用了 - > withTrashed()。
我怀疑belongsToMany()方法没有考虑数据透视表上的deleted_at字段。
有没有人遇到过类似的问题?我对这种关系做错了吗?
非常感谢你的帮助!!!
答案 0 :(得分:2)
添加:
->whereNull('friends.deleted_at')
对我的模型friends()方法似乎很容易解决我的问题(愚蠢的是我几分钟前没想过它)。我原以为Eloquent能够正确处理这些软删除的枢轴行。
我仍然想知道我是否误解了如何使用这些关系......
答案 1 :(得分:2)
我假设你有一个使用Friend
的{{1}}模型。
软删除是Model的一个功能。但是,BelongsToMany关系不需要为数据透视表定义模型,因此即使它存在,也不会考虑模型。它适用于基表。由于关系不知道连接到数据透视表的任何模型,因此它不知道数据透视表上的软删除。
您当前的解决方案可能没问题,但您可能需要考虑使用SoftDeletingTrait
代替:
wherePivot
这样,soft dele子句用于任何其他内部关系处理,最终构建专门针对数据透视表的新查询(例如sync,detach,updateExistingPivot等)。