Pivot table Laravel 5:将3个表与2个数据透视表连接起来

Pivot table Laravel 5:将3个表与2个数据透视表连接起来,pivot-table,laravel-5,Pivot Table,Laravel 5,我试图查找c表中与a表中的一行相关联的所有行(请参见DB schema)。由两个数据透视表连接,每个数据透视表具有n:m关系 数据库模式: 下面是我如何定义关系的: In model A: $this->belongsToMany("App\B"); In Model B: $this->belongsToMany("App\A"); $this->belongsToMany("App\C"); In model C: $this->belongsT

我试图查找c表中与a表中的一行相关联的所有行(请参见DB schema)。由两个数据透视表连接,每个数据透视表具有n:m关系

数据库模式:

下面是我如何定义关系的:

In model A: 
  $this->belongsToMany("App\B");

In Model B:
  $this->belongsToMany("App\A");
  $this->belongsToMany("App\C");

In model C:
  $this->belongsToMany("App\B");
通过将方法getC添加到A雄辩模型中,我已经达到了目标:

它工作得很好,但不符合我的要求。如果我建立了一个新的集合,我就无法进行分页等。。。在C表中的行上。如果有上千排的话,它也会很重

如果我尝试这样做:

A::findOrFail($id)->b
我获得了B的集合,但无法直接获得所有C。如果我迭代B的集合:

A::findOrFail($id)->b->each(function($b){
    $b->c();
});
我得到了所有的C,但我失去了对C雄辩的直接访问权,我无法进行计数、分页等。。在上面

有没有其他方法可以做这样的事情

A::findOrFail($id)->b->c->paginate(n);
A::findOrFail($id)->b->c->count();
A::findOrFail($id)->b->c->all();
etc...

供参考——同样的问题也由作者提出,他在哪里接受了答案


摘录:

你需要的是一种“从多到多”的关系,但拉威尔不支持这种关系

这里有一条关于它的旧线索:

人们已经想出了一些变通办法,我可以给你提供另一个我认为很干净的办法。它是一个嵌套在模型C中的作用域

模型C--

--控制器代码--

A::findOrFail($id)->b->c->paginate(n);
A::findOrFail($id)->b->c->count();
A::findOrFail($id)->b->c->all();
etc...
public function scopeHasAViaB($query, $ids) {
    if (empty($ids)) {
        return new \Illuminate\Database\Eloquent\Collection();
    }
    return $query->whereHas('b', function ($query) use ($ids) {
            $query->whereHas('a', function ($query) use ($ids) {
                $query->whereIn('id', $ids);
            });
        });
}
$modelAkeys = [1,2];
$cc = ModelC::HasAViaB($modelAKeys)->paginate(10);