Laravel与数据透视表的关系

时间:2014-07-04 15:54:55

标签: laravel laravel-4 eloquent

在我的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!*/
        },
    }
}

1 个答案:

答案 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;