web-dev-qa-db-ger.com

Laravel 5.4: Wie man durch das Anforderungsfeld iteriert?

Meine Anfragedaten repräsentieren ein Array von neuen und vorhandenen Elementen. Ich versuche, durch dieses Array Elemente zu aktualisieren und zu erstellen. 

So rufe ich das Array ab:

$userInput = $request->all();
foreach( $userInput['items'] as $key=>&$item){

Später im Code aktualisiere ich ein vorhandenes Element:

$updateItem = Item::find($item['id']);
$updateItem->number = $item['number'];
$updateItem->save();

Aber $item['number'] scheint alte Eingaben aus früheren Updates zu enthalten und nicht den Wert, den ich beim letzten Mal eingegeben habe.

Wie kann ich Anforderungsdaten in Laravel durchlaufen?

Dies ist der gesamte Code, während ich ihn ausführen (will Verwirrung loswerden):

$userInput = $request->all();
// checking $userInput here
// I can see the new value in the array

foreach( $userInput['items'] as $key=>$item){
  if($item['delete'] == 1) {
    Item::where('order_id',$order->id)
      ->where('id',$item['id'])
      ->delete();
  } else {
    if(empty($item['id'])) {
    } else {
      $updateItem = Item::find($item['id']);
      $updateItem->number = $item['id'];
      $updateItem->save();
    }
  }
}

Dies ist eine Eingabe von html (nur um zu zeigen, dass ich auch das Formular überprüft habe, die Daten kommen in Ordnung):

<input id="basicItemNumber-31" class="form-control" name="items[31][number]" placeholder="Unique number" value="31" type="text">
7
sr9yar

Es ist wahrscheinlich, dass Sie irgendwo in Ihrer for versehentlich den Wert Ihres unterlagerten $item geändert haben, während Sie ihn als Referenz übergeben (mit dem & vor dem Variablennamen).

Es wird von einigen oder den meisten Menschen als schlechte Praxis betrachtet, da dies zu "unerwartetem" Verhalten führen kann, zum Beispiel. Nehmen Sie den folgenden Beispielcode, der zweimal durch Referenz und einmal nach Wert durch eine Variable array von $items durchläuft.

<?php

$items = ['one','two','three'];

foreach ($items as &$item) {
    //do nothing.
}

foreach ($items as $item) {
    //do nothing again.
}

var_dump($items);

//outputs

array(3) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
  [2]=>
  &string(3) "two"
}
1
Luke

Versuchen Sie etwas Ähnliches, da dies Ihren Geltungsbereich lokal hält:

$request['items']->each(function($item, $key) use ($order) {
    if ($item->delete) {
        Item::where('order_id',$order->id)
              ->where('id',$item['id'])
              ->delete();
    } else {
        if (!empty($item['id'])) {
            $updateItem = Item::find($item['id']);
            $updateItem->number = $item['id'];
            $updateItem->save();
        }
    }
});
0
Spholt