There is the useful hasManyThrough in Eloquent in which you can you 3 Tables and define which keys to use to join them.
Laravels example and documentation can be found here .
There is a little detail problem with it, it is all called id and the example wasn’t helping me much.
I have the following tables to handle job applications to jobs
Jobs
– id
– title
– description
Users
– id
– firstname
– lastname
Application
– id
– user_id
– job_id
– application_date
In the jobs
model I want to get a list of all applicants.
Here is the first version of this
public function applicants(): HasManyThrough { return $this->hasManyThrough( 'App\Models\User', 'App\Models\Application', 'job_id', 'id', 'id', 'id' ); }
While testing I received some strange applicants which never applied for the job.
After debugging I found that the last 'id'
uses job.id
to load the users with user.id
. Bug found.
It should really be application.user_id
to load the correct users. So a small change to this:
public function applicants(): HasManyThrough { return $this->hasManyThrough( 'App\Models\User', 'App\Models\Application', 'job_id', // (application.job_id) 'id', // Foreign key on User table (user.id) 'id', // Local key on job table (job.id) 'user_id' // Local key on Application table (application.user_id) ); }
So changing the last id
to user_id
fixed that bug.