Waail
Waail

Reputation: 5

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?

Upvotes: 0

Views: 462

Answers (2)

Donkarnash
Donkarnash

Reputation: 12845

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;

Upvotes: 0

IGP
IGP

Reputation: 15849

The idea of hasManyThrough is to skip the intermediate table. If you need to look at the cases and the details maybe you should define other relations for it.

// User model
public function cases()
{
    return $this->hasMany(Cases::class, 'user_id');
}
// Cases model
public function details()
{
    return $this->hasMany(Detail::class, 'user_id');
}
$users = User::with('cases.details')->get();

foreach ($users as $user) {
    // an user
    foreach ($user->cases as case) {
        // a case
        foreach ($case->details as $detail) {
            // the details of a case
        }
    } 
}

Upvotes: 0

Related Questions