2017-02-16 121 views
4

我的请求数据表示一系列新的和现有的项目。我试图通过这个数组来更新和创建项目。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"> 
+0

没有通过'$ item'在参考了'for',你可以得到意外的行为。即使用'$ item' * not *'&$ item' – Luke

+0

删除这个&。将会工作 – JYoThI

+0

我更新了我的问题,通过值传递仍然给了我相同的结果。 – sr9yar

回答

1

这可能是因为里面某个地方for你在不经意间改变了你的下属$item的价值,你通过引用(变量名称前使用&传递)

这被认为是一些或大多数人不好的做法,因为它可能导致“意外”的行为,例如。采取下面的示例代码,循环通过$itemsarray两次,一次引用和一次值。

<?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" 
} 
+0

我看到通过参考标志传递是误导性的。对于那个很抱歉。我的想法太不明了,所以我在尝试所有我能想到的愚蠢的想法,并在写这个问题时意外地离开了它。本来我是按价值传递美元,但仍然有这个问题。 – sr9yar

+0

所有我可以建议的然后是你'dd($ item ['number'])'并且检查它是你期望的结果。并从那里开始工作。 – Luke

+0

说实话,这是我问之前停下的地方。 :)我只是觉得在拉拉维尔有一些我无法理解的魔法。无论如何,dd给了我正确的价值。和!如果我做了'$ updateItem-> number = 999;'它可以正确保存。谢谢你的帮助。 – sr9yar

0

尝试是这样的,因为它会保持你的本地范围:

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