Search code examples
phplaravelapilaravel-5.8laravel-resource

Laravel Api Resource


I'm trying to create an API for my data tables using Laravel's resource. I have three models with relationships. Every time I hit my api routes to check the result I'm getting a null value in my sub_specializations. Here's the result already JSON formatted.

    { 
"data":[ 
    { 
        "first_name":"Rusty",
        "last_name":"Ferry",
        "specializations":{ 
            "specialization_id":11,
            "specialization_name":"Endocrinology"
        },
        "sub_specializations":null
    },
    { 
        "first_name":"Nadia",
        "last_name":"Ondricka",
        "specializations":{ 
            "specialization_id":22,
            "specialization_name":"ENT"
        },
        "sub_specializations":null
    },
    { 
        "first_name":"Erich",
        "last_name":"Torphy",
        "specializations":{ 
            "specialization_id":2,
            "specialization_name":"Cardiologist"
        },
        "sub_specializations":null
    }
    ]
}

Here are all my resources. This the DoctorsResource

    public function toArray($request)
{
    return [
        'first_name' => $this->first_name,
        'last_name'  => $this->last_name,
        'specializations' => new SpecializationsResource($this->specializations),
        'sub_specializations' => new SubSpecializationsResource($this->sub_specializations),
    ];
}

Specializations Resource

    public function toArray($request)
{
    return [
        'specialization_id' => $this->specialization_id,
        'specialization_name' => $this->specialization_name,
    ];

}

SubSpecializations

    public function toArray($request)
{
    return [
        'sub_specialization_id' => $this->sub_specialization_id,
        'sub_specialization_name' => $this->sub_specialization_name,
        'doctors' => new DoctorsResource($this->doctors),
    ];
}

Lastly, this is the controller

    protected $user;

public function __construct(Doctors $doctors){
    $this->doctors = $doctors;
}

public function index()
{
    $doctors = $this->doctors->with('specializations', 'subSpecializations')->get();
    return DoctorsResource::collection($doctors);
}

The result that I'm expecting is similar to this

{ 
"data":[ 
    { 
        "first_name":"Rusty",
        "last_name":"Ferry",
        "specializations":{ 
            "specialization_id":11,
            "specialization_name":"Endocrinology"
        },
        "sub_specializations": {
            "sub_specialization_name":"value"
       }
    }
  ]
}

Solution

  • You have to make sure there is data of Sub Specializations for particular doctor.

    If there is data then add that data to Doctor Resource otherwise it will be blank.

    Just need to change line in doctor Resource like:

    'sub_specializations' => $this->sub_specializations !== null ? new SubSpecializationsResource($this->sub_specializations) : '',
    

    You can do same thing with specializations also.