try
public function index()
{
$grades = Grade::get();
return new GradeCollection($grades);
}
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
When I return custom array from Grade Resource it works fine. But when i return same custom array instead of parent::toArray($request) from GradeCollection it gives above on first key of the array. Following is the code i am using.
Route::namespace('Api\v1')->prefix('v1')->group(function () {
Route::get('exams', 'ExamController@index')->name('api.v1.exams.index');
Route::get('exams/{id}', 'ExamController@show')->name('api.v1.exams.show');
Route::get('exams/{id}/grades', 'ExamController@gradesShow')->name('api.v1.exams.grades.index');
});
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Grade extends Model
{
protected $fillable = [
'grade_name', 'grade_section', 'teacher_id'
];
public function teacher()
{
return $this->belongsTo('\App\Models\Teacher');
}
public function students()
{
return $this->hasMany('\App\Models\Student');
}
public function exams()
{
return $this->belongsToMany('\App\Models\Exam');
}
}
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Grade extends JsonResource
{
public function toArray($request)
{
// return parent::toArray($request);
return [
'id' => $this->id,
'name' => $this->grade_name,
'section' => $this->grade_section,
];
}
}
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class GradeCollection extends ResourceCollection
{
public function toArray($request)
{
// return parent::toArray($request);
return [
'id' => $this->id,
'name' => $this->grade_name,
'section' => $this->grade_section
];
}
}
namespace App\Http\Controllers\Api\v1;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Grade;
use App\Http\Resources\Grade as GradeResource;
use App\Http\Resources\GradeCollection;
use App\Http\Resources\StudentCollection;
class GradeController extends Controller
{
public function index()
{
$grades = Grade::all();
return new GradeCollection($grades);
}
public function show($id)
{
$grade = Grade::find($id);
return new GradeResource($grade);
}
public function studentsShow($id)
{
$grade = Grade::find($id);
return new StudentCollection($grade->students);
}
}
@talentedaamer it's because in $grades there are (or there can be) mutliple items
What you can do is
class GradeCollection extends ResourceCollection
{
public function toArray($request)
{
// return parent::toArray($request);
$grades = array();
foreach ($this->resource as $grade) {
$grades[] = array(
'id' => $grade->id,
'name' => $grade->grade_name,
'section' => $grade->grade_section
);
}
return $grades;
}
}
But if you want the grades just in a array format you can also do this in your controller
return Grade::select('id', 'grade_name as name', 'grade_section as section')->get()->toArray();
Please or to participate in this conversation.