【发布时间】:2019-03-06 20:02:54
【问题描述】:
说明
用户使用条形码模型(可以是商品、包裹或库存货架)扫描条形码和系统响应。
return new BarcodeResource($barcode);
条码资源根据条码类解析条码资源。每个条形码模型返回不同的 JSON 资源。
// BarcodeResource.php
$modelResource = app()->makeWith(__NAMESPACE__ . '\\' . class_basename($this->barcodable) . 'Resource', [
'resource' => $this->barcodable
]);
return [
'code' => $this->code,
'model_type' => class_basename($this->barcodable),
'model_data' => $modelResource
];
万一……
- ...文章,我想打印包含此类文章的包裹
- ...包裹,我要打印位置(库存货架),包含的物品和子包裹
- ...库存货架,我想打印所有包裹
问题
我想用递归资源防止无限循环。
Article
>> Package
>> Article (infinity loop begins because package resource
returns articles in spesific package)
Package
>> Article
>> Package (loop...)
>> Inventory Shelf
>> Package (loop...)
>> Child package
Inventory Shelf
>> Package
>> Article
>> Inventory Shelf (loop...)
>> Child package
急切的加载和解除关系应该是一种解决方案,但我如何才能在正确的阶段解除这些关系呢?这甚至可以使用一个资源还是我应该制作多个资源(递归/正常)?
尝试
包含关系的额外属性
我尝试了这个解决方案,但神奇地$this->relations 属性在几次递归后变为整数 1...
class PackageResource extends JsonResource
{
private $relations;
public function __construct($resource, array $relations = [])
{
parent::__construct($resource);
$this->relations = $relations;
}
public function toArray($request)
{
return [
'id' => $this->id,
'articles' => $this->when(in_array('articles', $this->relations), ArticleResource::collection($this->articles, $this->relations)),
'children' => PackageResource::collection($this->children, $this->relations),
];
}
【问题讨论】:
-
与尝试相关:失去关系,因为关系是通过构造函数预期的,但您通过集合方法传递它。
-
你也应该覆盖收集方法。
标签: php laravel eloquent eager-loading