web-dev-qa-db-ja.com

Laravel 5.4:リクエスト配列を反復する方法は?

私のリクエストデータは、新しいアイテムと既存のアイテムの配列を表しています。この配列を更新してアイテムを作成しようとしています。

これは私が配列を取得する方法です:

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

コードの後半で、既存のアイテムを更新します。

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

だが $item['number']には、前回入力した値ではなく、以前の更新からの古い入力が含まれているようです。

Laravelのリクエストデータをループするにはどうすればよいですか?

これは私がそれを実行するときの全体のコードです(混乱を取り除きたい):

$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();
    }
  }
}

これはhtmlからの入力です(フォームを確認したことを示すためだけに、データは問題なく表示されます)。

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

変数名の前に$itemを使用して参照渡しすると、forのどこかで、下線の値&が誤って変更された可能性があります。

これは、たとえば「予期しない」動作につながる可能性があるため、一部またはほとんどの人々によって悪い習慣と見なされています。以下のサンプルコードを参考にして、array$itemsを参照によって2回、値によって1回ループします。

<?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"
}
2
Luke

スコープをローカルに保つため、次のようなものを試してください。

$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