Laravel API 资源中的多级关系
Posted
技术标签:
【中文标题】Laravel API 资源中的多级关系【英文标题】:Laravel Multi level relationship in API Resource 【发布时间】:2019-06-23 10:22:31 【问题描述】:我的问题是,我真的不需要加载 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(in ->with()) 中提到的关系。
提前致谢。
【问题讨论】:
【参考方案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'))
];
【讨论】:
非常感谢 Namoshek。【参考方案2】:也许您正在寻找Conditional Relationships?
理想情况下,它应该如下所示:
public function toArray($request)
return [
'box_id'=> $this->box_id,
'item' => ItemResource::collection($this->whenLoaded('item'))
];
item
键仅在关系已加载时才会出现。
【讨论】:
以上是关于Laravel API 资源中的多级关系的主要内容,如果未能解决你的问题,请参考以下文章