[英]Laravel 4.2 returning soft deleted on BelongsToMany results
您好,我刚刚注意到softDelete的一种怪异行为。 基本上,当我查询一组相关的模型时,Eloquent返回一个集合,其中也包含软删除的行。
我一直遵循4.2关于软删除特征使用的指南,只要我获取/删除/还原/强制删除我的模型,我的代码就可以正常工作。 关系引发了这个问题。
考虑这种情况:我有一个用户模型,该模型具有一个beforeToMany友谊关系,其中可以按照以下方式接受/等待/请求/阻止友谊状态:
public function friends() {
return $this->belongsToMany('User', 'friends', 'user_id', 'friend_id')->where('status', 'accepted');
}
这个朋友表行基本上是“向量”,其中user1-> status-> user2,反之亦然(user2-> status-> user1在另一行上)。 当user1决定不再与user2成为朋友时,将自动删除2个朋友行。
这是问题所在:当我像这样从控制器查询数据库时:
$friends = $user->friends;
即使软删除的行也显示在返回的集合中,即使我希望这些都不会显示在结果中,除非我使用了-> withTrashed()。
我怀疑EmiratesToMany()方法没有考虑到数据透视表上的Deleted_at字段。
有没有人遇到过类似的问题? 我在这种关系上做错了吗?
非常感谢你的帮助!!!
新增:
->whereNull('friends.deleted_at')
对我的模型friends()方法似乎很容易解决我的问题(对不起,我几分钟前没有考虑过)。 我希望Eloquent能够正确处理这些已软删除的数据透视表行。
我还是想知道我是否误会了如何使用这些关系。
我假设您有一个使用SoftDeletingTrait
的Friend
模型。
软删除是模型的功能。 但是,BelongsToMany关系不需要为数据透视表定义模型,因此即使存在模型也不会考虑模型。 它与基表一起使用。 由于该关系不知道连接到数据透视表的任何模型,因此也不知道对数据透视表进行软删除。
您当前的解决方案可能不错,但是您可能需要考虑使用wherePivot
代替:
->wherePivot('deleted_at', null)
// or
->wherePivot(Friend::getDeletedAtColumn(), null)
这样,软删除子句将用于其他任何内部关系处理,这些处理最终会建立专门针对数据透视表的新查询(例如,sync,detach,updateExistingPivot等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.