【问题标题】:Laravel 5.4: how to iterate through request array?Laravel 5.4:如何遍历请求数组?
【发布时间】: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"); 不知道为什么。

标签: php arrays laravel laravel-5 laravel-5.4


【解决方案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();
        }
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2017-12-12
    • 1970-01-01
    • 2016-01-08
    • 2023-03-19
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多