如何在 laravel 中访问另一个关系中的一个关系?

How to access one relation inside another relation in laravel?

我有一个查询,其中我使用像这样的函数加载了两个模型:

ModelA::with(['relationB', 'relationC.relationC.A'])->where(condition)->get();

所以,ModelA 有两个这样的关系:

public function B(){ return $this->blongsTo(B::class);}

public function C(){ return $this->blongsTo(C::class);}

现在,我的要求是我想在 B() 函数中添加一个条件,如下所示:

    public function C() { 

     if($this->B->status) {
        return $this->blongsTo(C::class)->withTrashed();
     }
     return $this->blongsTo(C::class);
   }

但它 return 这条语句为空:

if($this->B->status) 

这是错误信息

Trying to get property 'status' of non-object

我的最终要求是使用一个关系函数,我想根据条件获取已删除和未删除的记录,但不知何故它不起作用。

我的laravel应用程序版本是7.30.4。

关系函数(例如您的 public function C())在幕后发挥着神奇的作用。这是因为它实际上被设计为以查询方式调用,就像您已经使用 ::with(['relationB', ...]).

显示的那样

但是,正因为如此,如果您要预先加载 C,则 $this 尚未作为完整模型加载,因此 B 未定义(这假设 modelA 始终具有 B 关系)。如果您在执行查询时 dd($this),您会看到结果将是一个没有任何属性的模型。

从关系函数(以预加载为目标)中让它工作是非常困难的。您最好在其他地方执行逻辑,例如使用第二个查询。这是因为在关系功能中,无法知道潜在目标是谁或什么。但是,如果您仅在 modelA 加载后使用它,那么它可以正常工作。

你可以用 whereHas 做一些事情,但是你仍然需要做 2 个查询,或者你可以试试看你是否可以用 SQL IF 完成它声明,但这不会导致关系。