我的问题是,我确实不需要加载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())中提到的关系。
谢谢。
答案 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 attribtues和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'))
];