如何在 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 完成它声明,但这不会导致关系。
我有一个查询,其中我使用像这样的函数加载了两个模型:
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 完成它声明,但这不会导致关系。