Область действия переменных вне foreach в PHP
у меня есть следующий код в моем контроллере Laravel:
public function show(){
$user=User::where("id",Auth()->id())->first();
$vendedores1=User::where("sponsor",Auth()->id())->get();
$amount1=User::where("sponsor",Auth()->id())->count();
$amount2=0;
$amount3=0;
$vendedores2;
$vendedores3;
foreach ($vendedores1 as $vendedor1) {
$vendedores2=User::where("sponsor",$vendedor1->id)->get();
$amount2=+User::where("sponsor",$vendedor1->id)->count();
foreach ($vendedores2 as $vendedor2) {
$vendedores3=User::where("sponsor",$vendedor2->id)->get();
$amount3=+User::where("sponsor",$vendedor2->id)->count();
}
}
$cantidad=$amount1+$amount2+$amount3;
return view("/fuerzadeventa",compact("user","vendedores1","vendedores2","vendedores3","amount1","amount2","amount3","cantidad"));
}
Когда я помещаю dd($vendedores2)
внутри scope foreach
, он имеет содержимое, но помещая то же самое dd()
вне foreach
(после этого), он бросает мне пустой массив.
dd($vendedores2)
внутри foreach
:
dd($vendedores2)
вне foreach
:
1
1 answers
В вашем коде необходимо изменить или улучшить следующее:
- есть несколько повторяющихся запросов, которые могут быть объединены в один или удалены (
get()
, за которым следуетcount()
из того же запроса). - вы используете
=+
вместо+=
для суммирования данных. - содержимое переменных
$vendedores2
и$vendedores3
будет содержать значение, которое они имели во время последней итерации, а не совокупность.
Ваш код может выглядеть так:
<?php
public function show()
{
$user = User::where("id",Auth()->id())->first();
/* En vez de usar colecciones usaremos matrices */
$vendedores1 = User::where(
'sponsor',
Auth()->id()
)->get()->all();
$vendedores2 = [];
$vendedores3 = [];
foreach ($vendedores1 as $vendedor1) {
$vendedores = User::where(
'sponsor',
$vendedor1->id
)->get()->all();
foreach ($vendedores as $vendedor) {
/* Agregamos sin repetición al vendedor */
$vendedores2[$vendedor->id] = $vendedor;
$subvendedores = User::where(
'sponsor',
$vendedor->id
)->get()->all();
foreach($subvendedores as $subvendedor) {
$vendedores3[$subvendedor->id] = $subvendedor;
}
}
}
/* En vez de repetir la consulta User::where("sponsor",Auth()->id())->get()
usamos count con tu resultado */
$amount1 = count($vendedores1);
/* Lo mismo con el resto, no hace falta ir sumando porque a estas alturas
tendremos el total */
$amount2 = count($vendedores2);
$amount3 = count($vendedores3);
$cantidad = $amount1 + $amount2 + $amount3;
return view(
"/fuerzadeventa",
compact(
"user",
"vendedores1",
"vendedores2",
"vendedores3",
"amount1",
"amount2",
"amount3",
"cantidad"
)
);
}
1
Author: OscarGarcia, 2018-06-28 07:45:38