#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, но когда я использую некоторые поля, они равны нулю