Laravel API 资源中的多级关系

Laravel Multi level relationship in API Resource

我的问题是,我确实不需要 api 资源加载。 查看我的 Api 资源文件

//BoxItemResource.php

 public function toArray($request)
{
    return [
        'box_id'=> $this->box_id,
        'item_id'=> $this->item_id,
        'item'=> new ItemResource($this->item)
    ];
}

//ItemResource.php

public function toArray($request)
{
    return [
        'id' => $this->id,
        'shipping_price' => $this->shipping_price,
        'condition_id' => $this->condition_id,
        'condition' => new ConditionResource($this->condition)
    ];
}

//ConditionResource.php

public function toArray($request)
{
    return [
        'id'=> $this->id,
        'name'=> $this->name
    ];
}

//控制器

return BoxItemResource::collection(
        BoxItem::with([
            'item'
        ])->paginate(1)
    );

我的问题是,我这里只需要 BoxItem 和 Item。我真的不想加载条件。 如果我从 ItemResource.php 中删除条件关系,它将起作用。但问题是我在其他需要此条件的地方使用 ItemResource.php。

这里是否可以否定loading condition关系ship

更清楚地说,我想加载我在控制器中提到的关系(in ->with())。

提前致谢。

也许您正在寻找 Conditional Relationships

理想情况下,它应该如下所示:

public function toArray($request)
{
    return [
        'box_id'=> $this->box_id,
        'item' => ItemResource::collection($this->whenLoaded('item'))
    ];
}

item 键只有在加载关系后才会出现。

API 资源允许 conditional attribtues and conditional relationships.

对于我认为在您的情况下足以使用的属性,这意味着您可以简单地将属性值包装在 $this->when($condition, $value) 中,如果 $condition == false,整个属性将从结果中删除].所以你的代码的一个具体例子:

return [
    'box_id'=> $this->box_id,
    'item_id'=> $this->item_id,
    'item'=> $this->when($this->relationLoaded('item'), new ItemResource($this->item))
];

或者如果您更喜欢使用关系样式:

return [
    'box_id'=> $this->box_id,
    'item_id'=> $this->item_id,
    'item'=> new ItemResource($this->whenLoaded('item'))
];