【问题标题】:How to get data from additional table in many to many relationship?如何以多对多关系从附加表中获取数据?
【发布时间】:2019-12-09 11:47:26
【问题描述】:

表“产品”和“食谱”之间存在多对多关系。我创建了表 product_recipe 来处理这个问题,我的表如下所示:

标识 | recipe_id |产品编号 |金额

在我的刀片文件中我使用

@foreach($recipe->product as $row)
        <p>{{ $row->name }}</p>
@endforeach

获取配方中使用过的产品的名称。如何获得存储在 product_recipe 表中的产品数量?我是否必须为 product_recipe 表创建一个模型并从模型中获取它?

【问题讨论】:

    标签: laravel eloquent relationship


    【解决方案1】:

    您必须声明要包含额外的数据透视信息的关系,以便附加到记录的数据透视对象将不仅仅是“id”:

    public function products()
    {
        return $this->belongsToMany(Product::class)->withPivot('amount');
    }
    

    现在pivot 对象将包含字段amount

    foreach ($recipe->products as $product) {
        echo $product->pivot->amount;
    }
    

    “默认情况下,pivot 对象上只会出现模型键。如果您的数据透视表包含额外的属性,则必须在定义关系时指定它们”

    Laravel 6.x Docs - Eloquent Relationships - Many To Many - Retrieving Intermediate Table ColumnswithPivot

    【讨论】:

      【解决方案2】:

      你必须使用pivot属性。

        @foreach($recipe->product as $row)
          <p>{{ $row->pivot->field_name}}</p>
        @endforeach
      

      无需为product_recipe 创建模型。只需指定与两个模型相关的表名。

      return $this-&gt;belongsToMany('App\Product', 'product_recipe')-&gt;withPivot('amount'); 和其他模型类似。

      【讨论】:

      • 我像你说的那样使用了枢轴,但那没有任何回报。我在模型中声明了表名,但那无论如何都不起作用:( Foreach return $row->name 但 $row->pivot->amount 低了一行,什么都没有:/
      • @JaroslawNowak 因为你必须声明你想要额外的数据透视信息的关系,添加了一个答案来指定
      • @JaroslawNowak 按照建议我已经更新了答案。
      • @lagbox 你的答案是正确的。非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多