Search code examples
laraveleloquenteager-loadingeloquent-relationship

How to get data from table related through pivot table?


I have 4 tables: countries, activities, country_activities and packages. countries and activities are related through pivot table country_activity, and packages is related to country_activity. Now, How do I eager load all packages related to each activity in a country?

class Country extends Model
{
    public function activities() {
        return $this->belongsToMany('App\Models\Activity','country_activities')->using('App\Models\CountryActivity')->as('country_activities');
    }
}

class Activity extends Model
{
    public function countries() {
        return $this->belongsToMany('App\Models\Country','country_activities')->using('App\Models\CountryActivity')->as('country_activities');
    }
}

class Package extends Model
{
    public function country_activities() {
        return $this->belongsToMany('App\Models\CountryActivity');
    }
}

class CountryActivity extends Pivot
{
    protected $table = 'country_activities';

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

Solution

  • I did something similar in a project i worked on. I'm not sure it will work but it's worth the shot:

    $country = Country::find(1);
    $country->activities = $contry->activities()->get()->each(function ($i, $k){
        $i->packages = $i->pivot->packages;
        //$i->makeHidden('pivot'); -> This is useful if you want to hide the pivot table
    });
    var_dump($country);