在我的Laravel应用程序中,我有3个模型("材料","元素"&"参考"),它们的关系如下:
考虑到我想在一次急切加载中获得有关这些模型的所有信息,创建模型的最佳做法是什么?我应该使用自定义枢轴模型吗?
更新以获得更好的解释:
我使用此代码获得以下结果
材料:与('元件') - >首先();
我正在寻找的是ElementMaterial每个支点的参考。
{
id: 1001,
name: "Butter",
elements: [
{
id: 203,
unit: "g",
name: "Protein",
pivot: {
material_id: 1001,
element_id: 203,
element_amount: 0.85
/*I NEED REFERENCES HERE!*/
},
},
{
id: 204,
unit: "g",
name: "FAT",
pivot: {
material_id: 1001,
element_id: 204,
element_amount: 81.11
/*I NEED REFERENCES HERE!*/
},
}
}
答案 0 :(得分:3)
您肯定需要自定义数据透视模型。我假设您知道如何创建一个,所以这里只是一个关于如何使用它的建议:
// ElementMaterial = pivot model, elementMaterials = relation name
// OtherModel = model related to the above, otherModels = 1-m relation name
$material = Material::with('elements')->first();
// now to access otherModels you need something like this:
$material->elements->first()->pivot->otherModels;
将针对每个枢轴模型执行db查询,这是一种过度杀伤。
目前无法在枢轴模型上急切加载任何内容,即使在枢轴上设置$with
本身也无法提供帮助。
你可以这样做:
$material = Material::with('elements', 'elementMaterials.otherModels')->first();
// but now you can access elements directly:
$material->elements; //collection of Element models
// and other models through the pivot model:
$material->elementMaterials; // collection of pivot models
$material->elementMaterials->first()->otherModels; // collection of OtherModels
但$material->elements
和$material->...->otherModels
之间没有任何关联。
这就是为什么我建议你通过数据透视模式访问这两种关系:
$material = Material::with('elementMaterials.elements', 'elementMaterials.otherModels')->first();
// then
$material->elementMaterials->first()->elements;
$material->elementMaterials->first()->otherModels;