猿问

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

首先,我有一个 $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' => ???

]);

附加时我如何还包括数量?项目按预期附加,但也需要数量。


一只名叫tom的猫
浏览 282回答 1
1回答

BIG阳

您可以通过将字典传递给该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());使其适应您的需求。
随时随地看视频慕课网APP
我要回答