jeudi 27 juillet 2017

Laravel - Eager Load with constraints on hasMany relationship returns nothing

I have this relationship in my Department model:

public function subjects() {
    return $this->hasMany('App\Models\Subject');
}

If I run App\Models\Department::with(["subjects"])->get(), I see the following results (simplified for the point):

Illuminate\Database\Eloquent\Collection {#912
 all: [
    App\Models\Department {#790                         //Department
     ...
     code: "A",
     school_id: 1,
     school: App\Models\School {#796                    //School
       ...
       code: "Z",
     },
     subjects: Illuminate\Database\Eloquent\Collection {#813
       all: [
         App\Models\Subject {#806                       //Subject
           ...
           code: "M",
           department_id: 1,
           department: App\Models\Department {#817      //Department (by eager loading)
             ...
             code: "A",
             school_id: 1,
             school: App\Models\School {#823            //School
               ...
               code: "Z",
             },
           },
         },
         ...
       ],
     },
   },
   ...
 ],

}

Because I do not want any recursion, I tried running App\Models\Department::with(["subjects" => function($query){$query->select("id", "code")}])->get().

And all the Subjects are gone from the results, like so:

Illuminate\Database\Eloquent\Collection {#912
 all: [
    App\Models\Department {#790                         //Department
     ...
     code: "A",
     school_id: 1,
     school: App\Models\School {#796                    //School
       ...
       code: "Z",
     },
     subjects: Illuminate\Database\Eloquent\Collection {#813
       all: [],
     },
   },
   ...
 ],

}

Then I tried the same ->with() structure (with $query->select()) on hasOne() relationships and those worked. I also tried on hasMany() relationships and all of those failed. Why is that so? And how can I add constraints to hasMany() eager loads?



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire