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