Laravel-datatables: ¿Cómo puedo asignar una variable global para todas las filas?

Creado en 4 jul. 2017  ·  16Comentarios  ·  Fuente: yajra/laravel-datatables

Resumen del problema o solicitud de función

Necesito establecer una variable en cada iteración de la tabla de datos en uso, todas las funciones addColumn () y editColumn ().

Fragmento de código del problema

Algo como
''
return Datatables :: of ($ usuarios)
-> setGlobal (función ($ usuario) {
$ status = getUserStatus ($ usuario-> id) ;
})
-> addColumn ('estado', función ($ usuario) {
// devuelve getUserStatus ($ usuario-> id);
return $ status;
});
-> editColumn ('está_aprobado', función ($ usuario) {
// devuelve getUserStatus ($ usuario-> id)? verdadero Falso;
return ($ status)? verdadero 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'];

->

Detalles del sistema

  • Sistema operativo
  • Versión PHP
  • Versión de Laravel
  • Versión de Laravel-Datatables
question

Comentario más útil

¿global? pasar la variable al cierre?

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

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

Todos 16 comentarios

¿global? pasar la variable al cierre?

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

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

Quiero que el estado cambie en cada iteración.
Para cada usuario debería cambiar.

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;

no cierre el problema antes de la revisión del desarrollador.

Si lo desea en cada iteración, entonces no es 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 columna de adición o edición, necesito llamar a la misma función. que hará una llamada a la consulta MySql, por lo que si tengo 5 columnas usando esta misma función, en una iteración, la misma consulta MySql, llame 5 veces y para 1000 registros será 1000 * 5 = 5000 consulta duplicada.

Si utilizo la paginación, también para un mínimo de 20 registros 20 * 5 = 100 consultas duplicadas.

Utilice la carga ansiosa si desea resolver problemas N + 1.

Vea esta demostración para la referencia: https://datatables.yajrabox.com/relation/belongs-to

O use declaraciones de unión e incluya el estado de su 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'),
            ]);

La consulta es así de complicada. No creas que será posible una carga ansiosa

Para usar las funciones getXYZ y setXYZ dentro de add and edit Column, necesitamos obligatoriamente un objeto de Eloquent.

Ok, no esperaba una consulta tan complicada. ^ _ ^

¿Puede considerar usar caché entonces? Si el estado no cambia con mucha frecuencia, también puede configurarlo para un período de tiempo más largo.

- Editar -
Tal vez algo como:
`` php
function getUserStatus ($ id) {
return Cache :: recordar ('user.status.'. $ id, 1, function ($ id) {
return Estado :: buscar ($ id);
});
}

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

Espero que algo como esto esté ahí

No estoy realmente seguro de su sugerencia setGlobal ya que aún necesitaría iterar en cada usuario para poder obtener el estado, por lo tanto, se seguirán realizando múltiples llamadas a funciones.

Realmente busco una salida para deshacerme de cientos de consultas duplicadas. solo porque llamar a getXYZ y setXYZ en más de una columna.

También tengo el mismo problema y quiero usar una variable global (común) para poder usarla para cada iteración como una variable común
@ruchisheth Si tiene algo, por favor comparta su respuesta

Gracias por la ayuda por adelantado.. :)

mismo @ruchisheth

@rajanjain y @haratmalli No tengo ninguna solución para esto.

hola intentaste en la primera columna poner

datos-> estatuas = 4;

llamarlo en la segunda devolución de llamada?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

shadoWalker89 picture shadoWalker89  ·  3Comentarios

vipin733 picture vipin733  ·  3Comentarios

FilipeBorges1993 picture FilipeBorges1993  ·  3Comentarios

SGarridoDev picture SGarridoDev  ·  3Comentarios

jgatringer picture jgatringer  ·  3Comentarios