私のリクエストデータは、新しいアイテムと既存のアイテムの配列を表しています。この配列を更新してアイテムを作成しようとしています。
これは私が配列を取得する方法です:
$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">
変数名の前に$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"
}
スコープをローカルに保つため、次のようなものを試してください。
$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();
}
}
});