【问题标题】:HasMany Deep Relationship有很多深厚的关系
【发布时间】:2019-08-18 14:50:06
【问题描述】:

我有 5 个模型和一个数据透视表CountryProvinceCityAreaTourtour_location。如何实现以下功能?

$country->tours

$province->tours

$city->tours

$area->tours

Country.php HasMany Provinces

public function provinces()
{
    return $this->hasMany('App\Province', 'country_id', 'id');
}

Province.php HasMany Cities

public function cities()
{
    return $this->hasMany('App\City', 'province_id', 'id');
}

City.php HasMany Areas

public function areas()
{
    return $this->hasMany('App\Area', 'city_id', 'id');
}

Area.php BelongsToMany Tours

public function tours()
{
    return $this->belongsToMany('App\Tour', 'tour_locations');
}

【问题讨论】:

标签: php laravel relationship


【解决方案1】:

直接的方法是使用joins,另一种方法是创建扩展hasManyThrough() 的自定义关系。第三个选项 -imo- 是使用Eloquent-has-many-deep 包。

使用这个包,你可以这样做:

class Country extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function tours()
    {
        return $this
          ->hasManyDeep('App\Tour', ['App\Province', 'App\City', 'App\Area', 'area_tour']);
    }
}

然后在你的控制器中:

// ...
$country = Country::find(1);
$tours = $country->tours;

免责声明:我不以任何方式参与此套餐。我只是建议它,因为它是实现您想要的行为的最简单方法。

【讨论】:

  • 是的区域有数据透视表,但无论如何我明白了。
  • @Fay 我已经更新了方法,我认为这是建立关系的正确方法。试一试,告诉我这是否有效。
猜你喜欢
  • 2018-09-23
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2019-02-01
  • 2014-07-10
  • 2015-08-05
  • 2015-04-07
  • 2016-10-12
相关资源
最近更新 更多