Передача массивов через формы в Laravel - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь передать несколько массивов через форму контроллеру Laravel и прикрепить значения формы к отношению.

Я пытался перебрать массив запросов, но получил «неопределенный индекс»ошибка, и я знаю, что я не получаю данные как-то. Заранее спасибо.

form.php

<form method="POST" action="{{ route('/trs') }}">
  @csrf
<input type="hidden" name="name[]" value="{{ $item->name }}" />
<input type="hidden" name="product_id[]" value="{{ $item->product_id }}" />
<input type="hidden" name="price[]" value="{{ $item->price }}" />
<input type="hidden" name="quantity[]" value="{{ $item->quantity }}" />
<button type="submit" class="btn btn-primary">
 Buy
</button>
 </form

Controller

  public function purchase(Request $request)
  {
         $data = $request->except('_token');
         $user= User::find(Auth::user()->id);
             foreach ($data as $item) {
              $ids = $item['product_id'];
              $names = $item['name'];
              $prices = $item['price'];
              $quantities = $item['quantity'];
              $orders->products()->attach([$ids => ['quantity' => $quantities, 'price' => $prices]]);
           }
  }

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Ваш foreach выполняет итерацию по входам, а не по массивам в этих входах:

foreach ($data as $item)

На первой итерации $item - это массив name. Во второй итерации $item - это массив product_id и т. Д. name не имеет индекса с именем name, price или quantity, его индексы являются числовыми (0-индексированными).

Одним из способов будет итерация тех входных данных, которые являются массивами:

for ($i = 0; $i < count($data['names']); $i++) {
    $name = $data['name'][$i];
    $product_id = $data['product_id'][$i];
    $price = $data['price'][$i];

    ...
}

Здесь делаются предположения, но, надеюсь, это иллюстрирует, что вам нужно сделать, если вы хотите продолжать использовать входные данные, названныев настоящее время.

Обновлено:

Если вы хотите изменить имена входов, вам может быть проще сгруппировать их:

<input type="hidden" name="items[{{ $item->id }}][name]" value="{{ $item->name }}" />
<input type="hidden" name="items[{{ $item->id }}][price]" value="{{ $item->price }}" />
...

foreach ($request->input('items', []) as $id => $item) {
    $name = $item['name'];
    $price = $item['price'];
    ...
}

Теперь входы, которые относятся к одному элементу, группируются в массив вместе по идентификатору элемента.

Когда вы добавляете поля динамически, вы должны убедиться, что вы также используете этот аналогименование, которое включает ключ для группировки их, в данном случае «id».

items[27][name]
items[27][price]
...
1 голос
/ 22 октября 2019

Если ваша форма находится внутри foreach коллекции элементов, задайте ID элемента в качестве имени массива и атрибуты в виде ключей, например

<form method="POST" action="{{ route('/trs') }}">
    @csrf
    <input type="hidden" name="{{ $item->id }}[product_id]" value="{{ $item->id }}" />
    <input type="hidden" name="{{ $item->id }}[name]" value="{{ $item->name }}" />
    <input type="hidden" name="{{ $item->id }}[price]" value="{{ $item->price }}" />
    <input type="hidden" name="{{ $item->id }}[quantity]" value="{{ $item->quantity }}" />
    <button type="submit" class="btn btn-primary">
        Buy
    </button>
</form

Если вы сделаете $request->all(), вы увидитечто нет ключей name или price, все ключи просто 0, поэтому вы должны установить их явно

<sidenote> У вас действительно есть маршрут с именем /trs? это не должно быть url('/trs')? </sidenote>

<sidenote> Вы можете получить аутентифицированного пользователя, просто auth()->user() </sidenote>

Надеюсь, это поможет

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