У меня есть этот цикл foreach:
мой $items выглядит так:
array:2 [▼
0 => array:3 [▼
"variant_id" => "393c6c70-8cb7-11e8-815a-f9c70a1fbe8e"
"name" => "Medicine 1"
"quantity" => "1"
]
1 => array:3 [▼
"variant_id" => "8a80d340-e0c1-11e8-86a4-3b06d2b50e37"
"name" => "Medicine 2"
"quantity" => "1"
]
]
Теперь в моем foreach я сравниваю variant_id с моей базой данных, получаю points из этой базы данных и умножаю его на quantity Лекарств.
points для Лекарства 1 = 50
points для Лекарства 2 = 20
так что это должно быть 50 (лекарство 1 очко) умножить на 1 (количество лекарства 1) и
20 x 1 (лекарство 2), а затем сумма обоих, которая должна быть равна 70. Но когда я использую dd($sum), я получаю 50, что только для лекарства 1.
$sum = 0;
foreach ($items as $variants) {
$id = $variants['variant_id'];
$quantity = $variants['quantity'];
$find = Activity::where('variant_id', $id)->first();
$act_points = $find->points * $quantity;
$sum += $act_points;
dd($sum);
}
Что мне здесь не хватает?
Вы должны распечатать данные после завершения цикла. Таким образом, это даст вам правильный результат.






Вы можете видеть dd() как Dump and Die. Это сбросит запрошенные данные и убьет скрипт. Поскольку это выполняется, сценарий завершается до того, как он сможет завершить цикл.
Вам нужно использовать dd()после foreach-loop
$sum = 0;
foreach ($items as $variants) {
$id = $variants['variant_id'];
$quantity = $variants['quantity'];
$find = Activity::where('variant_id', $id)->first();
$act_points = $find->points * $quantity;
$sum += $act_points;
}
dd($sum);
Если вы не хотите останавливать выполнение вашего скрипта, используйте вместо этого функцию dump.
Я понимаю, что вы делаете дамп отладки (dd) внутри цикла foreach, поэтому он просто остановится после первой итерации.
Вы должны сделать dd вне цикла foreach.
Чтобы рационализировать и избежать нескольких вызовов БД, вы можете сделать следующее
$input = [
[
"variant_id" => "393c6c70-8cb7-11e8-815a-f9c70a1fbe8e",
"name" => "Medicine 1",
"quantity" => "1",
],
[
"variant_id" => "8a80d340-e0c1-11e8-86a4-3b06d2b50e37",
"name" => "Medicine 2",
"quantity" => "1",
],
];
$sum = Activity::whereIn('variant_id', array_column($input, 'variant_id'))->get()->sum(function ($s) use ($input) {
foreach ($input as $k => $v) {
if ($s->variant_id == $v['variant_id']) {
return $s->points * $v['quantity'];
}
}
});
Это будет работать, если в массиве $input нет повторяющихся элементов по variant_id.
Другими словами, если каждое значение $input[n]['variant_id'] уникально.
dd($sum);послеforeach.