优美的morphTo()->withTrashed()方法失效了

5

我在 OrderItem 模型中设置了一个多态关联,其中的 saleable 可以是几个不同的模型。

我像任何其他关联一样进行了设置:

public function saleable()
{
    return $this->morphTo()->withTrashed();
}

这个以前运行得很好,现在突然不工作了,并且会抛出错误:
Call to undefined method Illuminate\Database\Query\Builder::withTrashed()

我不明白为什么它会停止工作,可能是由于composer更新导致Laravel更新。我使用的是v5.2.35版本。有什么想法为什么它会停止工作以及我有什么其他解决方案吗?
更新:在v5.2.33及更早版本中正常工作。可能是一个错误,我已经在github上开了一个问题

你的问题帮助我解决了我的问题。需要在多态中获取已删除的模型。谢谢! - plushyObject
2个回答

8
我查看了代码,找到了一个解决方案!这个解决方案是针对我的问题而言的,其中一些模型可以进行软删除而另一些则不行。
use Illuminate\Database\Eloquent\SoftDeletingScope;
//...
public function mySometimesSoftDeletableRelation(){
    return $this->morphTo()->withoutGlobalScope(SoftDeletingScope::class);
}

withTrashed 的核心是使用了 unset,它不在乎是否对未设置的内容进行取消设置,因此它会删除那些具有 SoftDeletingScope 的模型上的该范围,并对其他模型无影响。


我在 Laravel 8.0 中又遇到了这个问题,尽管据说在5.2版本或之后已经修复了。不过这个解决方案对我很有帮助。 - narrei

2
我能想到的唯一可能是您已经删除了对象的SoftDelete trait,因此它不再加载,或者您已经添加了一个不继承父级的boot方法(因此它不会从这个trait中加载适当的方法)
编辑
似乎这是在v5.2.34中引入的错误。在这个PR中似乎已经修复了https://github.com/laravel/framework/pull/13828 编辑
目前应该已经修复了。v5.2.36已发布。

谢谢回复。每个saleable模型都有SoftDeletes trail,因此在实际的OrderItem上不需要一个。我也没有向模型添加boot方法。 - Wasim
@Wasim,在更新到最新版本之前,你有更改过任何代码吗?你还记得更新之前使用的5.2版本号吗? - Marcin Nabiałek
老实说,我有一段时间没有测试过那段代码了,所以我不确定。让我回滚 Laravel 框架版本,看看能否让它正常工作。 - Wasim
好的,它在5.2.34版本中出现了问题。在5.2.33及更早版本中运行良好。我认为这不可能没有通知就被删除,所以我认为这一定是个bug? - Wasim
1
@Wasim 我认为你是对的。这是一个bug。当你查看5.2.34版本的changelog https://github.com/laravel/framework/blob/5.2/CHANGELOG.md时,你会看到“在使用急切加载时将约束应用于morphTo关系”。可能已经在这里修复了:https://github.com/laravel/framework/pull/13828/commits,但它还没有作为5.2.36版本发布。 - Marcin Nabiałek
@Wasim 5.2.36已经发布。如果您更新到此版本,是否修复了该错误? - Marcin Nabiałek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接