skip to Main Content

A Teacher has many Students. When I am showing the Teachers list I also want to show the counts of Student for each Teachers. How can I do this by using Eloquent?

I can find the Teachers from this,
$teacher= Teacher::where('teacher_status','active')->get();

I can find the Student count from this
$student_count = Student::where('teacher_id','teachers.id')->count();

How can I conbine this two query and return the response in a single array/collection?

3

Answers


  1. If you want to count the number of students related to teacher without actually loading them you may use the withCount method and this add new propery named by a {relation}_count column on your resulting models. For example:

    Teacher::where('teacher_status','active')->withCount('students')->get();
    

    Also you need and to your Teacher model hasMany relation method to Students

    Login or Signup to reply.
  2. In your teacher model, create the relationship students:

    class Teacher extends Model
    {
        public function students()
        {
            return $this->hasMany(Student::class, 'teacher_id');
        }
    }
    

    In your controller you can do the following:

    public function example(){
        $teachers = Teacher::where('teacher_status','active')->withCount('students')->get();
        
        return view('teacherViewExample', compact('teachers'));
    }
    

    In your view (teacherViewExample):

    <table>
      <thead>
        <tr>
          <th>Teacher Name</th>
          <th>Students Count</th>
        </tr>
      </thead>
      <tbody>
        @foreach($teachers as $teacher)
        <tr>
          <td>{{ $teacher->name }}</td>
          <td>{{ $teacher->students_count }}</td>
        </tr>
        @endforeach
      </tbody>
    </table>
    

    Full documentation on how to use withCount() here: https://laravel.com/docs/9.x/eloquent-relationships#counting-related-models

    Sometimes you may want to count the number of related models for a
    given relationship without actually loading the models. To accomplish
    this, you may use the withCount method. The withCount method will
    place a {relation}_count attribute on the resulting models:

    Login or Signup to reply.
  3. In case frontend and backend are separated, i.e Laravel for backend, Angular for frontend, below are examples for Laravel:

    In api.php,

    Route::get('teacher-with-students-count', 'TeacherController@getTeacherWithStudentsCount');
     
    

    In Teacher.php (model)

    class Teacher extends Model
    {
        public function students()
        {
            return $this->hasMany(Student::class, 'teacher_id', 'id');
        }
    }
    

    In TeacherController.php

    public function getTeacherWithStudentsCount()
        {
            $teachers = Teacher::where('teacher_status','active')->withCount('students')->get();
    
            return $this->giveSuccessResponse($teachers);
        }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search