Коллекция ресурсов Laravel, отображающая пустое поле

#laravel #api #eloquent #collections #resources

Вопрос:

Я разрабатываю API с Laravel. В одной из конечных точек, к которой я обращаюсь, некоторые поля показывают нулевое значение, но в нем должна быть некоторая информация.

Обратите внимание на поля «addicionais_descricao» и «valor», оба всегда имеют нулевые значения, когда я включаю их в массив attributeitems, но если я оставлю его на начальном уровне, данные будут представлены, но это не решит мой случай, потому что мне нужна эта информация с элементами атрибута:

введите описание изображения здесь

Именно здесь конечная точка вызывает, я делаю запрос в таблице «Атрибут», которая связана с таблицей «Атрибуты», в то время как таблица «Атрибуты» связана с «Атрибутом» и «продуктом».

 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),
    ];
}
 

Ресурс Attributo Itens:

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

Какова правильная процедура в этой ситуации?

Ответ №1:

Возьмите этот пример в качестве примера :

Контроллер

 $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 
            ]
        ];
    }
 

Комментарии:

1. Я попытался адаптировать вашу рекомендацию, но безуспешно. Я покажу вам свой результат.

Ответ №2:

Что-то вроде этого должно помочь вам делать то, что вы хотите. Я не могу точно сделать это для тебя. кстати, почему вы не используете Красноречие, что-то вроде Attribute::where(...)->with(['relation_1', 'products'])->get();

 public function toArray($request)
    {
        return [
            'id' => $this->id,
            'attributes' => [...],
            'products' => $this->collection
                      ->map(function($this->product) use ($request) {
                            return (new ProductResource($product))->toArray($request);
                        }),
        ];
    }
 

Комментарии:

1. Я не использую его из-за недостатка знаний. Но я попытался использовать создание «Принадлежностомании» ( laravel.com/docs/8.x/… ) отношения. результат отличный, когда я не использую AttributeResource::collection, но когда я использую некоторые поля, они равны нулю