Pivot table Laravel 5:将3个表与2个数据透视表连接起来
我试图查找c表中与a表中的一行相关联的所有行(请参见DB schema)。由两个数据透视表连接,每个数据透视表具有n:m关系 数据库模式: 下面是我如何定义关系的: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
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);