我有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');
}
答案 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;
免责声明:我不以任何方式参与此软件包。我只是建议这样做,因为这是实现所需行为的最简单方法。