通过属于多对有关系

时间:2019-05-14 15:33:31

标签: laravel eloquent

是否可以通过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模型中声明相似的关系,以获取所有餐厅的所有员工吗?

4 个答案:

答案 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包,您可以在其中定义这种嵌套关系。

https://github.com/staudenmeir/eloquent-has-many-deep