雄辩 - 渴望加载逆

时间:2018-03-27 14:00:37

标签: laravel laravel-5 eloquent laravel-eloquent

主要问题是我需要根据动态表急切加载。我需要找到一种方法来产生一个雄辩的命令,可以通过以下方式产生一个集合。

  • 外径
    • 物料
      • 制造零件编号
      • 制造零件编号
      • 制造零件编号
      • 制造零件编号
  • 外径
    • 物料
      • 制造零件编号
      • 制造零件编号
      • 制造零件编号
      • 制造零件编号
    • ....

我提出的一个雄辩的命令会产生不理想的结果:

$tinker> App\Models\ManufacturePartNumber::with('outsideDiameters', 'materials', 'measurements')->get();

根据我的关系,这会产生以下集合:

  • 制造零件号
    • 外径
      • 材料
  • 制造零件号
    • 外径
      • 材料
  • 制造零件号
    • 外径
      • 材料
    • ....

在修补玩耍时,我试图运行这个命令,这对我来说。它会产生一个错误,这是我预期的一半。

$tinker> App\Models\OutsideDiameter::with('materials', 'manufacturePartNumbers')->get(); Illuminate\Database\Eloquent\RelationNotFoundException with message 'Call to undefined relationship [materials] on model [App\Models\OutsideDiameter].'

最终,我的问题是我需要建立一个雄辩的命令,可以按照所需的方式急切加载结果。从立场来看,该命令将是动态的,模型关系基于用户与站点的交互。想想像亚马逊这样的东西,左边是复选框过滤器。我看到的方式是,我需要提出所有可能的模型组合,并使用所有数据创建相应的数据透视表。这对我来说似乎并不高效......

关于如何实现目标的任何想法?

我给出的模型定义如下:

class ManufacturePartNumber extends Eloquent  
{  
  public function materials()  
  {  
    return $this->belongsToMany(\App\Models\Material::class);  
  }   

  public function outsideDiameters()  
  {  
    return $this->belongsToMany(\App\Models\OutsideDiameter::class);  
  }  
}

class Material extends Eloquent  
{  
  public function manufacturePartNumbers()  
  {  
    return $this->belongsToMany(\App\Models\ManufacturePartNumber::class);  
  }   
}

class OutsideDiameter extends Eloquent  
{  
  public function manufacturePartNumbers()  
  {  
    return $this->belongsToMany(\App\Models\ManufacturePartNumber::class);  
  }  
}

2 个答案:

答案 0 :(得分:0)

您可以急切加载关系关系。 IE:OutsideDiameter::with('manufacturePartNumbers', 'manufacturePartNumbers.materials')->get()

您还可以动态加载关系,只需将保存它们的变量传递给with。

$relationships = ['materials', 'materials.manufacturePartNumbers'];
ManufacturePartNumber::with($relationships)->get();

因此,您可以根据需要添加到关系数组。这有帮助吗?

答案 1 :(得分:0)

正如我在此过程中发现的那样,Eloquent不允许您查询不存在的关系。此问题使用三个表和相应的数据透视表,以使其工作。即使使用Eloquent的hasManyThrough,它也只适用于最多三个表。

归根结底,我无法从无到有。我的解决方案是我背负着N + 1问题。