Laravel-datatables: Como posso atribuir uma variável global para todas as linhas.

Criado em 4 jul. 2017  ·  16Comentários  ·  Fonte: yajra/laravel-datatables

Resumo do problema ou solicitação de recurso

Eu preciso definir uma variável em cada iteração da tabela de dados em usar todas as funções addColumn () e editColumn ().

Fragmento de código do problema

Algo como
`` `
return Datatables :: of ($ users)
-> setGlobal (function ($ user) {
$ status = getUserStatus ($ user-> id) ;
})
-> addColumn ('status', função ($ user) {
// retorna getUserStatus ($ user-> id);
return $ status;
});
-> editColumn ('is_approved', function ($ user) {
// retorna getUserStatus ($ user-> id)? verdadeiro falso;
return ($ status)? verdadeiro falso;


so, each time I don't need to call this **getUserStatus($user->id)** function.
<!--
If applicable, please include a copy of your code
which triggers the suspected bug.

You may use the markdown php code tags to format your paste:

```php
$params = ['foo'];

->

Detalhes do sistema

  • Sistema operacional
  • Versão PHP
  • Versão Laravel
  • Versão Laravel-Datatables
question

Comentários muito úteis

global? é só passar a variável no fechamento?

$status = getUserStatus($user->id);

return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
  return $status;
});

Todos 16 comentários

global? é só passar a variável no fechamento?

$status = getUserStatus($user->id);

return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
  return $status;
});

Eu quero que o status seja alterado a cada iteração
Para cada usuário, ele deve mudar.

return Datatables::of($users) ->setGlobal(function ($user){ //for $user->id = 1 //status = true //for $user->id = 2 // status = false **$status** = **getUserStatus($user->id)**; }) ->addColumn('status', function ($user) { // return getUserStatus($user->id); return $status; }); ->editColumn('is_approved', function ($user) { //return getUserStatus($user->id) ? true : false; return ($status) ? true : false;

não feche o problema antes da revisão do desenvolvedor.

Se você quiser em cada iteração, não é GLOBAL .

->addColumn('status', function ($user) {
    return getUserStatus($user->id);
});
->addColumn('status', function ($user) {
    return getUserStatus($user->id);
})
->editColumn('xyz', function ($user) {
    return getUserStatus($user->id);
});

Para cada adição ou edição de coluna, preciso chamar a mesma função. que fará a chamada para a consulta MySql, portanto, se eu tiver 5 colunas usando essa mesma função, em uma iteração a mesma consulta MySql chamará 5 vezes e para 1000 registros será 1000 * 5 = 5000 consulta duplicada.

Se eu usar paginação, também para um mínimo de 20 registros 20 * 5 = 100 consultas duplicadas.

Use o carregamento antecipado se quiser resolver os problemas N + 1.

Veja esta demonstração para ref: https://datatables.yajrabox.com/relation/belongs-to

Ou use as instruções de junção e inclua o status em sua consulta.

https://datatables.yajrabox.com/fluent/joins

$assignments = DB::table('assignments as a')
        ->when($round_id != "" || $round_id != NULL, function ($query) use ($round_id) {
            return $query->where('a.round_id', '=', $round_id);
        })
        ->leftJoin('rounds as r', 'a.round_id', '=', 'r.id')
        ->leftJoin('surveys as su', 'a.id', '=', 'su.assignment_id')
        ->leftJoin('projects as p', 'r.project_id', '=', 'p.id')
        ->leftJoin('sites as s',  'a.site_id', '=', 's.id')
        ->leftJoin('fieldreps as f', 'a.fieldrep_id', '=', 'f.id')
        ->leftJoin('chains as ch','p.chain_id','=','ch.id')
        ->leftJoin('clients as c','ch.client_id','=','c.id')
        ->when(is_string($status) && $status != "", function ($query) use ($status, $current_date) {
            if($status == 'late'){
                return $query->where(function ($query) use ($current_date) {
                    $query->where(function ($query)  {
                        $query->where(DB::raw('IFNULL( DATE_FORMAT(a.deadline_date,"%Y-%c-%e"), DATE_FORMAT(r.deadline_date,"%Y-%c-%e"))'), '<', DB::raw('CURDATE()'));
                    })
                    ->where(function ($query) use ($current_date) {
                        $query->where('a.is_scheduled', '=', true)
                        ->where('a.is_reported', '=', false)
                        ->where('a.is_partial', '=', false);
                    });
                });
            }else if($status == 'scheduled'){
                return $query->where(function ($query) use ($current_date) {
                    $query->where(function ($query)  {
                        $query->where(DB::raw('IFNULL( DATE_FORMAT(a.deadline_date,"%Y-%c-%e"), DATE_FORMAT(r.deadline_date,"%Y-%c-%e"))'), '>=', DB::raw('CURDATE()'));
                    })
                    ->where(function ($query) use ($current_date) {                     
                        $query->where('a.is_scheduled', '=', true)
                        ->where('a.is_reported', '=', false)
                        ->where('a.is_partial', '=', false);
                    });
                });
            }
            else if($status == 'pending'){
                return $query->leftJoin('assignments_offers as ao', function($join)
                {
                    $join->on('a.id', '=', 'ao.assignment_id');
                })
                ->where('a.is_scheduled', '=', false)
                ->where(DB::raw('(SELECT count(id) as offer_count FROM assignments_offers where assignment_id = a.id and is_accepted is null)'), '<=', '0')
                ->groupBy('a.id');
            }else if($status == 'offered'){
                return $query->leftJoin('assignments_offers as ao', function($join)
                {
                    $join->on('a.id', '=', 'ao.assignment_id');
                })
                ->where(['a.is_scheduled' => false, 'a.is_offered' => true])->where(['ao.is_accepted' => NULL])
                ->groupBy('ao.assignment_id');
            }else if($status == 'reported'){
                return $query->where(['a.is_reported' => true, 'is_approved' => false]);
            }else if($status == 'partial'){
                return $query->where('a.is_partial', true);
            }else if($status == 'completed' || $status == 'approved'){
                return $query->where('a.is_approved', true);
            }
        })
        ->select([
            'a.id',
            'a.fieldrep_id',
            'a.deadline_date',
            'a.is_scheduled',
            'a.is_reported',
            'a.is_partial',
            'a.is_offered',
            'a.is_approved',
            'c.client_logo',
            'p.id as project_id',
            'p.project_name',
            'r.id as round_id',
            'r.round_name',
            's.site_code',
            's.site_name',
            's.city',
            's.state',
            's.zipcode',
            'su.id as survey_id',
            DB::raw("CONCAT(IFNULL( DATE_FORMAT(a.schedule_date,'%d %b %Y'), DATE_FORMAT(r.schedule_date,'%d %b %Y')), ' ' , IFNULL(TIME_FORMAT(a.start_time, '%h:%i %p'), TIME_FORMAT(r.start_time,'%h:%i %p'))) as assignment_scheduled"),
            DB::raw("CONCAT(IFNULL( DATE_FORMAT(a.deadline_date,'%d %b %Y'), DATE_FORMAT(r.deadline_date,'%d %b %Y')), ' ' , IFNULL(TIME_FORMAT(a.start_time, '%h:%i %p'), TIME_FORMAT(r.deadline_time,'%h:%i %p'))) as assignment_end"),
            DB::raw('CONCAT(f.first_name," ",f.last_name) as schedule_to'),
            DB::raw('(select COUNT(id) as offer_count from assignments_offers where assignment_id = a.id and is_accepted is null group by assignment_id) as offer_count'),
            ]);

A consulta é muito complicada. Não pense que o carregamento antecipado será possível

Para usar as funções getXYZ e setXYZ dentro de adicionar e editar Coluna, precisamos obrigatoriamente de um objeto do Eloquent.

Ok, não esperava uma consulta tão complicada. ^ _ ^

Pode então considerar o uso de cache? Se o status não mudar com frequência, você também pode configurá-lo para um período de tempo mais longo.

- Editar -
Talvez algo como:
`` `php
function getUserStatus ($ id) {
return Cache :: Remember ('user.status.'. $ id, 1, function ($ id) {
Return Status :: find ($ id);
});
}

->setGlobal(function ($user){
//for $user->id = 1 //status = true
//for $user->id = 2 // status = false
$status = getUserStatus($user->id);
})

Espero que algo assim esteja lá

Não tenho certeza sobre sua sugestão setGlobal pois você ainda precisa iterar em cada usuário para poder buscar o status, portanto, várias chamadas de função ainda serão realizadas.

Eu realmente procuro uma maneira de me livrar de centenas de consultas duplicadas. apenas porque chamar getXYZ e setXYZ em mais de uma coluna.

Eu também tenho o mesmo problema e quero usar uma variável global (comum) para que eu possa usá-la para cada iteração como uma variável comum
@ruchisheth Se você conseguiu algo, por favor, compartilhe sua resposta

Obrigado pela ajuda antecipadamente .. :)

mesmo @ruchisheth

@rajanjain e @haratmalli Não tenho solução para isso.

oi você tentou colocar na primeira coluna

dados-> estátuas = 4;

chamá-lo no segundo retorno de chamada?

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

mantrax314 picture mantrax314  ·  15Comentários

jayenn007 picture jayenn007  ·  21Comentários

hilioski picture hilioski  ·  14Comentários

Arkhas picture Arkhas  ·  15Comentários

faisalhilmi picture faisalhilmi  ·  18Comentários