Pass variable query buider Laravel

Asked

Viewed 610 times

0

I am 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 appears: Undefined variable: ano_school

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

1 answer

2


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

Your code is 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);
        });
})

Should be 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 one Closure inside another and want to use the variable of the main scope, it is necessary to "repeat" the use for each of them.

Let me give you a fictional example

$a = "valor";

call(function () use($a) { 

    return function () use($a) { 

        return function () use ($a) {
            echo $a;
        };
    };
})
  • 1

    What a strange thing!! rsrs It worked perfectly! Very Obrgado!!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.