Laravel使用附件在数据透视表中包含一个附加字段

时间:2019-05-16 03:01:54

标签: php laravel

首先,我有一个$ cart返回一个集合。 示例:

Collection {#391 ▼
  #items: array:2 [▼
    "027c91341fd5cf4d2579b49c4b6a90da" => CartItem {#393 ▼
      +rowId: "027c91341fd5cf4d2579b49c4b6a90da"
      +id: "1"
      +qty: 3
      +name: "item 1"
      +price: 9.99
      +options: CartItemOptions {#392 ▶}
      -associatedModel: null
      -taxRate: 21
    }
    "370d08585360f5c568b18d1f2e4ca1df" => CartItem {#394 ▶}
  ]
}

我正在使用ID来匹配商品

$cart = \Cart::content()->pluck('id', 'qty');

$items = Item::whereIn('id', $cart)->get();

然后将商品附加到订单上

$order->items()->attach($items, [
       'qty' => ???
]);

附加时还如何包含数量?物品会按预期附着,但也需要数量。

1 个答案:

答案 0 :(得分:0)

更新:如by Twitter user AnellyBot所指出,您可以通过将字典传递给attach方法来实现此目的:

$order->items()->attach(
    Cart::contents()->mapWithKeys(function ($item) {
          return [
              $item->id => ['qty' => $item->qty]
          ];
    })->all()
);

原始答案说,您无法使用attach方法执行此操作。显然是错误的。

由于代码在技术上仍然正确,因此我将保留原始答案。

Eloquent的attach方法不允许为每个附加记录添加不同的额外属性。

您必须直接附加每条记录,或者手动insert自己在数据透视表中记录。

这里有一些代码可以帮助您入门:

$order->items()->newPivotStatement()->insert(
    Cart::content()->map(function ($item) use ($order) {
        return [
            'order_id' => $order->id,
            'item_id' => $item->id,
            'qty' => $item->qty,
        ];
    })->all()
);

使其适应您的需求。