Laravel 5.4:如何遍历请求数组?
Posted
技术标签:
【中文标题】Laravel 5.4:如何遍历请求数组?【英文标题】:Laravel 5.4: how to iterate through request array? 【发布时间】:2017-07-05 11:05:25 【问题描述】:我的请求数据代表一个新的和现有的项目数组。我试图通过这个数组来更新和创建项目。
这就是我检索数组的方式:
$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">
【问题讨论】:
不要在for
中通过引用传递$item
,因为您可能会遇到意外行为。即使用$item
not &$item
删除它,它会起作用
我更新了我的问题,按值传递仍然给我同样的结果。
这行得通$updateItem->number = $request->input("items.$key.number");
不知道为什么。
【参考方案1】:
很可能在for
内部的某个地方,您在通过引用传递时无意中更改了下属$item
的值(在变量名前使用&
。)
例如,某些或大多数人认为这是不好的做法,因为它可能导致“意外”行为。使用下面的示例代码,该代码循环通过 $items
的 array
两次,一次通过引用,一次通过值。
<?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"
【讨论】:
我发现通过引用符号传递具有误导性。对于那个很抱歉。我没有聪明的想法,所以我尝试了所有我能想到的愚蠢的想法,并在写问题时不小心离开了它。最初我是按价值传递 $item 的,但仍然有这个问题。 那么我只能建议您dd($item['number'])
并检查它是否符合您的预期。并从那里开始锻炼。
老实说,这就是我在询问之前停下来的地方。 :) 我只是认为 laravel 中有一些我无法理解的魔法。无论如何, dd 给了我正确的价值。和!如果我执行$updateItem->number = 999;
之类的操作,它会正确保存。感谢您的帮助。【参考方案2】:
尝试这样的事情,因为它会使你的范围保持在本地:
$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();
);
【讨论】:
以上是关于Laravel 5.4:如何遍历请求数组?的主要内容,如果未能解决你的问题,请参考以下文章