Laravel использовать attach, чтобы включить дополнительное поле в сводную таблицу - PullRequest
0 голосов
/ 16 мая 2019

Для начала у меня есть $ 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 ▶}
  ]
}

Я использую идентификатор для сопоставления элементов

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

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

Затем прикрепляю элементы к заказу

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

Как я могутакже включить кол-во при подключении?Элементы прикрепляются, как ожидается, но также нуждаются в кол-во.

1 Ответ

0 голосов
/ 16 мая 2019

Обновление : Как указано пользователем Twitter AnellyBot , этого можно добиться, передав словарь методу attach:

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

В первоначальном ответе говорилось, что вы не можете сделать это с помощью метода attach.Это явно неверно.

Я оставляю здесь исходный ответ, поскольку код все еще технически корректен.

Метод attach Eloquent не позволяет добавлять дополнительные атрибуты, которые отличаютсядля каждой прикрепленной записи.

Вам придется либо прикреплять каждую запись напрямую, либо вручную 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()
);

Адаптируйте его под свои нужды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...