Область действия переменных вне 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:

introducir la descripción de la imagen aquí

dd($vendedores2) вне foreach:

introducir la descripción de la imagen aquí

Author: Xerif, 2018-06-28

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