首页 > 解决方案 > Laravel 资源集合显示空字段

问题描述

我正在用 Laravel 开发一个 API。在我正在访问的端点之一中,某些字段显示为空值,但它应该包含一些信息。

请注意“addicionais_descricao”和“valor”字段,当我将它们包含在属性项数组中时,它们总是带有空值,但是如果我将其保留在初始级别,则会显示数据,但这并不能解决我的情况,因为我需要这些信息和属性项:

在此处输入图像描述

这是端点调用的地方,我在“属性”表中进行查询,该表与“属性项”表有关系,而“属性项”表链接到“属性”和“产品”。

public function show($id)
{

    $atributos = Atributo::query('atributo')
        ->select(
            'atributo.id',
            'atributo.atrdescricao',
            'atributoitens.atributo_id',
            'atributoitens.produto_id',
            'produto.prodescricao',
            'produto.provalor'
        )

        ->leftJoin('atributoitens', 'atributo.id', '=', 'atributoitens.atributo_id')
        ->leftJoin('produto', 'produto.id', '=', 'atributoitens.produto_id')
        ->where('atributo.id', '=', $id)

        ->get()->unique('id');

    return AtributoResource::collection($atributos);
}

资源属性:

    public function toArray($request)
{
    
    return [            
        'id' => $this->id,
        'descricao' => $this->atrdescricao, 
         'atributoitens' => AtributoitensResource::collection($this->atributoitens),
    ];
}

资源属性:

public function toArray($request)
{        
    
    return [
        'id' => $this->id,
        'atributo' => $this->atributo_id,
        'produtos' => $this->produto_id,            
        'adicionais_descricao' => $this->prodescricao,
        'valor' => $this->provalor            
        
    ];
}

这种情况的正确程序是什么?

标签: laravelapieloquentcollectionsresources

解决方案


以这个例子作为参考:

控制器

$data = $shop->products()
        ->whereStatus(true)
        ->where('product_shop.active', true)
        ->where('product_shop.quantity', '>=', $this->min_product_qty)
        ->paginate(50);

return (new ProductCollection($data))
    ->response()
    ->setStatusCode(200);

产品系列

public function toArray($request)
    {
        return [
            'data' => $this->collection
                      ->map(function($product) use ($request) {
                            return (new ProductResource($product))->toArray($request);
                        }),
            'brand' => $this->when($request->brand, $request->brand)
        ];
    }

产品资源

    public function toArray($request)
    {
        return [
            'type' => 'product',
            'id' => (string) $this->id,

            'attributes' => [
                'uuid' => $this->uuid,
                'name' => $this->name,
                'slug' => $this->slug,
                'description' => $this->description,
                'thumb_path' => $this->thumb_path,
                'cover_path' => $this->cover_path,
            ],

            'relationships' => [
                'brand' => $this->brand 
            ]
        ];
    }

推荐阅读