Search code examples
phplaraveleloquent-relationship

Cannot access Intermediate table in HasManyThrough relationship


My DB schema looks like this.

Now, in artisan tinker mode, When I try to query Details table from user Model, it shows me the records of the details table but I cannot access the the Cases Model for some reason, it always returns NULL in tinker.

This is my User Model

public function details()
{
    return $this->hasManyThrough('App\Models\Detail', 'App\Models\Cases', 'user_id', 'case_id', 'id', 'id');
}

What am I doing wrong?


Solution

  • If for convenience you want to access Details directly from the User model then you can define relations as - (may seem like a little duplication but worth if it results in ease)

    
    class User extends Model
    {
        public function cases()
        {
            return $this->hasMany(Case::class);
        }
    
        public function details()
        {
            return $this->hasManyThrough(Detail::class, Case::class);
        }
    }
    
    
    class Case extends Model
    {
        public function details()
        {
            return $this->hasMany(Detail::class);
        }
    
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }
    
    class Detail extends Model
    {
        public function case()
        {
            return $this->belongsTo(Case::class);
        }
    }
    

    Now both cases and details can be directly accessed via User record

    $user->cases;
    
    $user->details;