как форматировать ответы JSON с помощью Relationship - Laravel/Eloquent

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

"data": [
        {
            "product_id": 3,
            "product_name": "xyz",
            "sold": 0,
            "total": 500
            }
        }
        ]

но фактический формат, который я получаю, как показано ниже

"data": [
        {
            "product_id": 3,
            "product_name": "xyz",
            "prod": {
                "id": 1,
                "products_id": 3,
                "sold": 0,
                "total": 500
            }
        }
        ]

Мой класс контроллера предметов

class ItemCont extends BaseController
{
    
    public function index()
    {
        $items= Items::all();

        return $this->sendResponse(ItemResource::collection($items), 'Items retrieved successfully.');
    }
}

Мой класс ItemResource

     class ItemResource extends JsonResource
{
   
    public function toArray($request)
    {
        
        return parent::toArray($request);

       
    }
}

Модель предметов

    class Items extends Model
    {
        public $timestamps = false;
        protected $primaryKey = 'product_id';
    
        protected $guarded = [];
        protected $fillable = [
            'product_name'
        ];
    
           
        public function prod(){
            return $this->hasOne('App\Products','products_id','product_id');
        }
    }
products Model
    class Products extends Model
    {
        public $timestamps = false;
        protected $primaryKey = 'id';
    
        protected $guarded = [];
        protected $fillable = [
            'sold','total'
        ];
    
        
        public function item(){
            return $this->belongsTo('App\Items','product_id','products_id');
        }
     
        }
products resource class
class ProductResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
             
       return parent::toArray($request);
      
    }

Спасибо. Второй метод, который я пробовал, - это мой класс ItemResource.

class ItemResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        
        //return parent::toArray($request);

        return [
            'Product_id' => $this->id,
            'product_name' => $this->name
            //'products' => new Products($this->products),
            //'sold' => $this->sales,
            //'total' => $this->total,
        ];
    } 

мой класс ресурсов продукта

class ProductResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
               return [
            "sold" => $this->sales,
         "total"=>$this->total
            
       ];
         //   return parent::toArray($request);

      
    }

и мой класс ItemController

class ItemCont extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $items= Items::with('prod')->get();

        return $this->sendResponse(ItemResource::collection($items), 'Items retrieved successfully.');
    }

Ответ на попытку второго метода:

{
    "success": true,
    "data": [
        {
            "Product_id": null,
            "product_name": null
        },
        {
            "Product_id": null,
            "product_name": null
        }
    ],
    "message": "Items retrieved successfully."
}

1 ответ

Во-первых, вам нужно вручную создать возвращаемый массив в вашем классе ItemsResouce, например:

public function toArray($request)
{
  return [
        "product_id" => $this->id,
        "product_name"=> $this->name,
        "sold" => $this->prod->sold,
        "total" => $this->prod->total
        ];
}

Затем вам нужно создать класс коллекции ресурсов, вы можете назвать его ItemCollection. Ты можешь использоватьphp artisan make:resource ItemCollectionкоманда сделать класс. Класс должен выглядеть так:

class ItemCollection extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

А в методе index вашего контроллера вы можете вернуть ответ следующим образом:

//use use App\Http\Resources\ItemCollection;
public function index()
{
    $items= Items::with('prod')->get();
    return new ItemCollection($items); //or use your send response helper method
}
Другие вопросы по тегам