I'm using laravel eloquent queries to get the result of all students belonging to a department. The relationship is like this: Each department has classes. Each class has students.
If we are writing this on MySQL, we can have two versions: Let's say we want students belonging to department 5.
- select * from class inner join student on class.id = student.class_id where class.department_id = 5;
Equivalent Laravel Eloquent Query:
return $classRepo->where(['department_id'=>5])
            ->select(['id','department_id'])
            ->with(['students'])
            ->get();
- select * from student inner join class on class.id = student.class_id where class.department_id = 5;
Equivalent Laravel Eloquent Query:
return $studentRepo
        ->with(['class' => function($query){
            $query->select(['id', 'department_id'])
                ->where(['department_id' => 5]);
        }])
        ->get();
Unexpectedly, the result from the first version is this:
[
    {
        "id": 3,
        "department_id" : 5,
        "students": [
            {
                "id": 61060,
                "name" : "Mark"
            },
            {
                "id": 61061,
                "name" : "Tony"
            }
           ]
    }
]
and from second version is this:
[
    {
        "id": 61057,
        "name" : "Smith",
        "class": null
    },
    {
        "id": 61058,
        "name" : "Jason",
        "class": null
    },
    {
        "id": 61060,
        "name" : "Mark",
        "class": {
            "id": 3,
            "department_id": 5
        }
    },
    {
        "id": 61061,
        "name" : "Tony",
        "class": {
            "id": 3,
            "department_id": 5
        }
    }
]
Can anyone explain me the difference in the results between the two versions? Why I am having nulls in the second version against the class key? How laravel eloquent is actually processing the queries?
classRepo is an object of 'Classes' class
class Classes extends Model{
    public function students()
    {
        return $this->hasMany('App\repoModels\Student','class_id','id');
    }
}
studentRepo is an object of 'Student' class
class Student extends Model{
   public function class()
    {
        return $this->hasOne('App\repoModels\Classes', 'id', 'class_id');
    }
}
via Chebli Mohamed
 
Aucun commentaire:
Enregistrer un commentaire