是否可以通过belongsToMany关系建立Laravel关系?
我有4张桌子:
1)饭店(id,name)-与hass表使用hasManyRelation
2)导演(id,姓名)
3)Directors_Restaurants(id,director_id,restaurant_id)-用于将belongsToMany餐厅与Directors连接的数据透视表
3)工人(id,姓名,restaurant_id)
通过Directors模型中的此功能,我可以获取所有关联的餐厅
public function restaurants()
{
return $this->belongsToMany('App\Restaurant','director_restaurant');
}
使用我的代码中的此功能,我可以让一位总监所有餐厅的所有员工
$director = Director::find(1);
$director->load('restaurants.workers');
$workers = $director->restaurants->pluck('workers')->collapse();
所以我的问题是:我可以在Director模型中声明相似的关系,以获取所有餐厅的所有员工吗?
答案 0 :(得分:2)
当然可以在Eager Loading的Director模型上使用hasMany
关系方法
就像下面一样
public function restaurants()
{
return $this->hasMany(Restaurant::class)->with('restaurants.workers');
}
答案 1 :(得分:1)
我可以提出这样的解决方案:
导演模型选项1
public function getAllRestaurants(){
return $this->hasMany(Restaurant::class)->with('restaurants.workers');
}
导演模型选项2
public function getAllRestaurants(){
$this->load('restaurants.workers');
return $this->restaurants->pluck('workers')->collapse();
}
您可以在任何地方找到所有餐馆
$all_restaurants = Director::find(1)->getAllRestaurants();
答案 2 :(得分:1)
您可以通过“跳过” restaurants
表来定义直接关系:
class Director extends Model
{
public function workers()
{
return $this->belongsToMany(
Worker::class,
'director_restaurant',
'director_id', 'restaurant_id', null, 'restaurant_id'
);
}
}
答案 3 :(得分:1)
accessor
方法来隐藏一些逻辑# App/Director.php
// You'll need this line if you want this attribute to appear when you call toArray() or toJson()
// If not, you can comment it
protected $appends = ['workers'];
public function getWorkersAttribute()
{
return $this->restaurants->pluck('workers')->collapse();
}
# Somewhere else
$director = Director::with('restaurants.workers')->find(1);
$workers = $director->workers;
但是最终,您仍然必须加载嵌套关系'restaurants.workers'
才能起作用。
HasMany
关系# App/DirectorRestaurant.php
public function workers()
{
return $this->hasMany(Worker::class, 'restaurant_id', 'restaurant_id');
}
# Somewhere else
$director = Director::find(1);
$workers = DirectorRestaurant::where('director_id', $director->id)->get()->each(function($q) { $q->load('workers'); });
但是我不推荐它,因为它不太可读。
最后,有一个staudenmeir/eloquent-has-many-deep
包,您可以在其中定义这种嵌套关系。