Laravel 如何通过透视表从相关表中获取数据?

Laravel 如何通过透视表从相关表中获取数据?,laravel,eloquent,eager-loading,eloquent-relationship,Laravel,Eloquent,Eager Loading,Eloquent Relationship,我有4个表格:国家、活动、国家/地区活动和套餐。 国家和活动通过数据透视表country_activity关联,而数据包与country_activity关联。 现在,如何加载与某个国家/地区的每个活动相关的所有包 class Country extends Model { public function activities() { return $this->belongsToMany('App\Models\Activity','country_activit

我有4个表格:国家、活动、国家/地区活动和套餐。 国家和活动通过数据透视表country_activity关联,而数据包与country_activity关联。 现在,如何加载与某个国家/地区的每个活动相关的所有包

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');
    }
}

我在一个项目中做了类似的事情。我不确定它是否有效,但值得一试:

$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);

所以,这对我来说很有效

   class Country extends Model
   {
        public function activities() {
        return $this->belongsToMany('App\Models\Activity','country_activities')->using('App\Models\CountryActivity')->withPivot(['id'])->as('country_activities');
   }
现在,在我的控制器中,我这样做

    $country = Country::with(['activities'=> function($q) {$q->where('name','Trekking');}])->where('name','Nepal')->first(['id','name']);
    $country->activities->map(function ($i){
        $i->country_activities->load('packages');
        return $i;
    });