Pass variable query buider Laravel

0

I'm trying to do this function with Laravel Query Builder

public function getEstudantesCargaHoraria(Request $request)
{
    $ano_letivo = $request->ano_letivo;
    $turma_id  = $request->id;

    $ano_letivo = 2017;
    $turma_id   = 528;

    $estudantes = DB::table('turmas_has_estudantes')
        ->leftJoin('estudantes_identificacao', 'estudantes_identificacao.id', '=', 'turmas_has_estudantes.estudantes_identificacao_id')
        ->leftJoin('estudantes_carga_horaria', function ($join) {
            $join->on('estudantes_carga_horaria.estudantes_identificacao_id', '=', 'turmas_has_estudantes.estudantes_identificacao_id')
                ->where(function ($query)  use ($ano_letivo) {
                    $query
                    ->whereNull('estudantes_carga_horaria.ano_letivo')
                    ->orWhere('estudantes_carga_horaria.ano_letivo', '=', $ano_letivo);
                });
        })

        ->select(
            'turmas_has_estudantes.id AS turmas_has_estudantes_id',
            'turmas_has_estudantes.numero',
            'estudantes_identificacao.nome_completo',

            'estudantes_carga_horaria.id AS estudantes_carga_horaria_id', 
            'estudantes_carga_horaria.estudantes_identificacao_id',
            'estudantes_carga_horaria.ano_letivo',
        )
        ->where('turmas_has_estudantes.turmas_id',     $turma_id)
        ->orderBy('turmas_has_estudantes.numero')
        ->orderBy('estudantes_identificacao.nome_completo')
        ->get();

    return $estudantes;
}

Error message: Undefined variable: ano_letivo

I researched the internet and recommended putting: use ($ ano_letivo) but, it did not work. Still not recognizing the variable

    
asked by anonymous 25.06.2018 / 18:27

1 answer

1

You are using a Closure within another. For this, you need to pass the variable to the scope of the second Closure through use .

Your code looks like this:

->leftJoin('estudantes_carga_horaria', function ($join) {
    $join->on('estudantes_carga_horaria.estudantes_identificacao_id', '=', 'turmas_has_estudantes.estudantes_identificacao_id')
        ->where(function ($query)  use ($ano_letivo) {
            $query
            ->whereNull('estudantes_carga_horaria.ano_letivo')
            ->orWhere('estudantes_carga_horaria.ano_letivo', '=', $ano_letivo);
        });
})

It should look like this:

->leftJoin('estudantes_carga_horaria', function ($join) use($ano_letivo) { // preste atenção nessa linha

    $join->on('estudantes_carga_horaria.estudantes_identificacao_id', '=', 'turmas_has_estudantes.estudantes_identificacao_id')
        ->where(function ($query)  use ($ano_letivo) {
            $query
            ->whereNull('estudantes_carga_horaria.ano_letivo')
            ->orWhere('estudantes_carga_horaria.ano_letivo', '=', $ano_letivo);
        });
})

That is, every time you use a Closure within another and want to use the main scope variable, it is necessary to "repeat" the use for each of them.

I'll give you a fictitious example

$a = "valor";

call(function () use($a) { 

    return function () use($a) { 

        return function () use ($a) {
            echo $a;
        };
    };
})
    
25.06.2018 / 18:38