在Laravel中嵌套多对多关系

时间:2018-11-17 11:51:32

标签: laravel many-to-many

我的表结构为

产品 ID

包装 ID

pack_products pack_id,product_id

pack_optional_products pack_id,product_id

因此,在上表中,title2将有packproductscompulsory products两种类型,这意味着如果客户购买optional products的产品,将自动订购该包装中的商品,但客户也可以查看包装中是否有可选产品,因此客户也可以购买该产品。

现在可以管理订单了。

订单 ID,customer_id

order_pack order_id,pack_id

使用pack方法attach

,一切正常

所以这里的问题开始了(当我尝试在订购的包装中添加订购的订购产品时),为了管理订购的订购产品,我创建了下表

order_pack_product 订单ID,pack_id,pack_optional_product_id

我已经创建了一个模型。

$order->packs()->attach($pack["pack_id"]);

然后我将该方法称为。

class Order extends Model
{
    //
    public function packs(){
        return $this->belongsToMany(Pack::class)->withTimestamps()->withPivot('name');
    }

    public function parent() {
        return $this->belongsTo(ParentCustomer::class);
    }
}

class OrderPack extends Model
{
    //
    public function optionalProducts()
    {
        return $this->belongsToMany(PackOptionalProduct::class, 'order_pack_product')->withTimestamps();
    }
}

我收到此错误。

  

BadMethodCallException:调用未定义的方法   照亮\ Database \ Eloquent \ Relations \ BelongsToMany :: optionalProducts()   在文件中   /.../....../laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php   在第50行

与上表相关的SO完整代码将是这个。

$order->packs()->optionalProducts()->attach($optionalProduct["pack_optional_product_id"]);

1 个答案:

答案 0 :(得分:0)

optionalProducts()是模型方法,而不是关系packs()

方法$order->packs()-返回关系对象,属性$order->packs-返回包模型的集合。

您需要迭代收集槽,以便将可选产品附加到每一个包装模型上。

foreach($pack["optional_products"] as $optionalProduct){
  foreach($order->packs as $item){
     $item->optionalProducts()->attach($optionalProduct["pack_optional_product_id"])
  }
}

也许,这段代码无法纠正错误,所以您需要纠正代码逻辑。