首页 文章

Laravel Eager加载多个多态关系 - 一些软删除,一些不删除

提问于
浏览
2

我有几个包含多态字段的模型 . 这些多边形字段每个包含四个或五个关系,一些是软可删除的,有些则不是 . 如果你这样做,我会陷入“该死的”,如果你不这样做,那就该死,而且不确定如何解决 .

如果我加载了对eager加载的调用而没有在具有softdeletes的模型上包含trashed:

$deptRisks = \App\DeptRisk::with(['owner', 'riskable']);

我将在那些已被软删除的模型上收到以下错误:

尝试获取非对象的属性

如果我使用withTrashed为softdeletes加载:

$deptRisks = \App\DeptRisk::with(['owner', 'riskable' => function ($query) {
        $query->withTrashed();
}]);

我将在那些尚未设置为软删除的模型上收到以下错误:

调用未定义的方法Illuminate \ Database \ Query \ Builder :: withTrashed()

我确定我错过了一些明显的东西,但我在旋转 . 请帮忙 .

2 回答

  • 0

    我有答案,但不是解决方案 . 我不相信Laravel目前这是可能的,这是不幸的 .

    一种解决方法是在关系层面强制执行此操作 . IE有两个独立的关系,有风险且有风险.WithTrashed . 然后你可以在加载过程中调用两个,一个没有闭包,另一个没有 . 这将成功加载所有模型,但有几个缺点,最糟糕的是总是必须创建围绕使用集合的if-check逻辑(一个字段基本上变成两个) .

    我选择不使用它,而是返回并将非软删除多态关系变为软删除 . 这不是一个有效的解决方案,但在两天未能合并后,它取得了成功 .

  • 0

    嗨,您可以在定义关系时尝试这样的事情:

    public function riskable() {
        $builder = $this->morphTo();
    
        if (method_exists($builder, 'withTrashed')) {
            $builder->withTrashed();
        }
    
        return $builder;
    }
    

相关问题