有很多深厚的关系

时间:2019-03-27 22:18:14

标签: php laravel relationship

我有5个模型,它们带有一个数据透视表Country Province City Area Tour tour_location。如何实现以下功能?

$country->tours

$province->tours

$city->tours

$area->tours

Country.php 有许多省份

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

Province.php 许多城市

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

City.php 有许多地区

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

Area.php 属于许多游览

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

1 个答案:

答案 0 :(得分:1)

直接方法是对join执行此操作,另一种方法是建立自定义关系来扩展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;

免责声明:我不以任何方式参与此软件包。我只是建议这样做,因为这是实现所需行为的最简单方法。