Laravel 4.2返回软件删除BelongsToMany结果

时间:2015-02-08 15:15:44

标签: php laravel eloquent

您好我刚刚注意到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字段。

有没有人遇到过类似的问题?我对这种关系做错了吗?

非常感谢你的帮助!!!

2 个答案:

答案 0 :(得分:2)

添加:

->whereNull('friends.deleted_at')

对我的模型friends()方法似乎很容易解决我的问题(愚蠢的是我几分钟前没想过它)。我原以为Eloquent能够正确处理这些软删除的枢轴行。

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

答案 1 :(得分:2)

我假设你有一个使用Friend的{​​{1}}模型。

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

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

wherePivot

这样,soft dele子句用于任何其他内部关系处理,最终构建专门针对数据透视表的新查询(例如sync,detach,updateExistingPivot等)。