为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
一只名叫tom的猫 2021-06-09 18:30:42
首先,我有一个 $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 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

您可以通过将字典传递给该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()

);

使其适应您的需求。


查看完整回答
反对 回复 2021-06-19
  • 1 回答
  • 0 关注
  • 281 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信