web-dev-qa-db-fra.com

Laravel 5.4: comment parcourir le tableau de requêtes?

Les données de ma demande représentent un tableau d'éléments nouveaux et existants. J'essaie de passer par ce tableau pour mettre à jour et créer des éléments. 

Voici comment je récupère le tableau:

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

Plus tard dans le code, je mets à jour un élément existant:

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

Mais $item['number'] semble contenir les anciennes entrées des mises à jour précédentes et non la valeur que j'ai entrée la dernière fois.

Comment puis-je parcourir les données de demande dans Laravel?

Voici le code entier tel que je le lance (je veux éliminer la confusion):

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

Ceci est une entrée de HTML (juste pour montrer que j'ai vérifié le formulaire aussi, les données sont très bien):

<input id="basicItemNumber-31" class="form-control" name="items[31][number]" placeholder="Unique number" value="31" type="text">
7
sr9yar

Il est probable que quelque part dans votre for vous avez modifié par inadvertance la valeur de votre $item sous-jacent lorsque vous le transmettez par référence (en utilisant le & avant le nom de la variable)

C'est considéré comme une mauvaise pratique par certaines personnes ou la plupart des gens, car cela peut entraîner un comportement "inattendu", par exemple. Prenez l'exemple de code ci-dessous qui parcourt une array de $items deux fois une fois par référence et une fois par valeur.

<?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"
}
1
Luke

Essayez quelque chose comme ceci, car cela gardera votre portée locale:

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