主要问题是我需要根据动态表急切加载。我需要找到一种方法来产生一个雄辩的命令,可以通过以下方式产生一个集合。
我提出的一个雄辩的命令会产生不理想的结果:
$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);
}
}
答案 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问题。