繁体   English   中英

Laravel 4.2返回软删除对BelongsToMany结果

[英]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能够正确处理这些已软删除的数据透视表行。

我还是想知道我是否误会了如何使用这些关系。

我假设您有一个使用SoftDeletingTraitFriend模型。

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

您当前的解决方案可能不错,但是您可能需要考虑使用wherePivot代替:

->wherePivot('deleted_at', null)
// or
->wherePivot(Friend::getDeletedAtColumn(), null)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM