使用Laravel whenLoaded()深度超过一层

Fre*_*rik 5 php laravel

我如何使用whenLoaded()进行比一级更深的关系?似乎只能whenLoaded像这样使用第一个关系深度:

'season' => $this->whenLoaded('origin', function () {
    return new SeasonResource($this->origin->season);
}),
Run Code Online (Sandbox Code Playgroud)

但是,如果Laravel origin加载了(如果未加载),那么seasonLaravel将会加载它,这会导致N + 1问题。这两个originseason的关系是有条件的,而且并不总是使用。因此,我想使用这样的东西:

$this->whenLoaded('origin.season', ...)
Run Code Online (Sandbox Code Playgroud)

或这个:

'season' => $this->whenLoaded('origin', function () {
     return new SeasonResource($this->origin->whenLoaded('season'));
}),
Run Code Online (Sandbox Code Playgroud)

这些都不起作用。我想更深层次的关系不存储在模型本身上,在第二种情况下,whenLoaded()查询生成器上不存在。

我如何使用whenLoaded()进行比一级更深的关系?

Dev*_*evK 7

我相信未实现的原因是因为它仅对hasOnebelongsTo关系有意义(返回对象而不是集合的关系)。

但是,如果是这样,您可以这样做:

'season' => $this->when(
    $this->relationLoaded('origin') &&
    $this->origin->relationLoaded('season'),
    function () {
        return new SeasonResource($this->origin->season);
    }
),
Run Code Online (Sandbox Code Playgroud)

基本上,使用->when代替->whenLoaded并手动检查是否使用->relationLoaded模型上的public方法加载了关系。