API资源中的Laravel多级关系

时间:2019-01-30 07:39:42

标签: laravel laravel-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。

是否可以在此处拒绝装载条件关系船。

更清楚地讲,我想加载我在controller(在-> with())中提到的关系。

谢谢。

2 个答案:

答案 0 :(得分:1)

也许您正在寻找Conditional Relationships

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

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

item键仅在已加载关系时出现。

答案 1 :(得分:1)

API资源允许conditional attribtuesconditional 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'))
];