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 &amp;$item 删除它,它会起作用 我更新了我的问题,按值传递仍然给我同样的结果。 这行得通$updateItem-&gt;number = $request-&gt;input("items.$key.number"); 不知道为什么。 【参考方案1】:

很可能在for 内部的某个地方,您在通过引用传递时无意中更改了下属$item 的值(在变量名前使用&amp;。)

例如,某些或大多数人认为这是不好的做法,因为它可能导致“意外”行为。使用下面的示例代码,该代码循环通过 $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"

【讨论】:

我发现通过引用符号传递具有误导性。对于那个很抱歉。我没有聪明的想法,所以我尝试了所有我能想到的愚蠢的想法,并在写问题时不小心离开了它。最初我是按价值传递 $item 的,但仍然有这个问题。 那么我只能建议您dd($item['number']) 并检查它是否符合您的预期。并从那里开始锻炼。 老实说,这就是我在询问之前停下来的地方。 :) 我只是认为 laravel 中有一些我无法理解的魔法。无论如何, dd 给了我正确的价值。和!如果我执行$updateItem-&gt;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:如何遍历请求数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.4 中存储数组 cookie?

Laravel 5.4 如何通过表单请求为用户分配角色?

如何在 Vue.js 和 Laravel 5.4 中发出 POST 请求

laravel 5.4在请求中验证之前修改数据[关闭]

从 5.4 升级后的 Laravel 419 发布请求

如何在 laravel 5.4 中实现 HTTPS