Laravel 5.4: cómo iterar a través de la solicitud de la matriz?

Mi solicitud de datos representa una matriz de nuevo y elementos existentes. Estoy intentando a través de esta matriz para actualizar y crear artículos.

Esto es cómo puedo recuperar la matriz:

$userInput = $request->all();
foreach( $userInput['items'] as $key=>&$item){

Más adelante en el código de la actualización de un elemento existente:

$updateItem = Item::find($item['id']);
$updateItem->number = $item['number'];
$updateItem->save();

Pero $item['number'] parece contener edad de entrada a partir de las actualizaciones anteriores y no el valor que introdujo la última vez.

¿Cómo puedo bucle a través de los datos de la solicitud en Laravel ?

Este es el código completo como yo lo ejecute (quiere deshacerse de confusión):

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

Esta es una entrada de html (sólo para mostrar lo comprobé el formulario también, la información viene muy bien):

<input id="basicItemNumber-31" class="form-control" name="items[31][number]" placeholder="Unique number" value="31" type="text">
  • No pase el $item por referencia en el for como usted puede conseguir comportamiento inesperado. yo.e uso $item no &$item
  • quitar este & .va a trabajar
  • He actualizado mi pregunta, que pasa por el valor que me da el mismo resultado.
  • Esto funciona $updateItem->number = $request->input("items.$key.number"); no sé por qué.
InformationsquelleAutor sr9yar | 2017-02-16

2 Kommentare

  1. 2

    Es probable que en algún lugar dentro de su for que por error ha cambiado el valor de su subalterno $item como se pasa por referencia (utilizando el & antes de que el nombre de la variable.)

    Se considera mala práctica de algunos o la mayoría de las personas, ya que puede conducir a la «inesperada» de comportamiento, Por ejemplo. tome el siguiente código de ejemplo que se repite a través de un array de $items dos veces, una vez por referencia y por valor.

    <?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"
    }
    • Veo que pase por referencia signo era engañosa. Lo siento por eso. Yo estaba fuera de brillantes ideas, por lo que yo estaba tratando de todos los estúpidos que yo podía pensar y accidentalmente dejó al escribir la pregunta. Originalmente estaba pasando $elemento de valor y todavía tenía este problema.
    • Todo lo que puedo sugerir, entonces, es que dd($item['number']) y comprobar que lo que usted espera que sea. y trabajar desde allí.
    • Para ser honesto, que es donde me detuve antes de preguntar. 🙂 Acabo de pensar que hay algo de magia en laravel que yo no puedo comprender. De todos modos, dd me da el valor correcto. Y! si puedo hacer algo como $updateItem->number = 999; Se guarda correctamente. Gracias por tu ayuda.
  2. 0

    Intentar algo como esto, ya que mantendrá su ámbito local:

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea