Laravel-datatables: Comment puis-je affecter une variable globale pour toutes les lignes.

Créé le 4 juil. 2017  ·  16Commentaires  ·  Source: yajra/laravel-datatables

Résumé du problème ou de la demande de fonctionnalité

Je dois définir une variable à chaque itération de la table de données en cours d'utilisation, toutes les fonctions addColumn () et editColumn ().

Extrait de code du problème

Quelque chose comme
''
return Datatables :: of ($ users)
-> setGlobal (fonction ($ utilisateur) {
$ status = getUserStatus ($ user-> id) ;
})
-> addColumn ('statut', fonction ($ utilisateur) {
// retourne getUserStatus ($ user-> id);
return $ status;
});
-> editColumn ('is_approved', function ($ user) {
// retourne getUserStatus ($ user-> id)? vrai faux;
retour ($ status)? vrai faux;


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'];

->

Détails du système

  • Système opérateur
  • Version PHP
  • Version de Laravel
  • Version Laravel-Datatables
question

Commentaire le plus utile

global? juste passer la variable à la fermeture?

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

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

Tous les 16 commentaires

global? juste passer la variable à la fermeture?

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

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

Je veux que le statut change à chaque itération
Pour chaque utilisateur, cela devrait changer.

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;

veuillez ne pas fermer le problème avant l'examen du développeur.

Si vous le voulez à chaque itération, ce n'est pas 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);
});

Pour chaque colonne d'ajout ou de modification, je dois appeler la même fonction. cela fera appel à la requête MySql, donc si j'ai 5 colonnes utilisant cette même fonction, dans une itération, même appel de requête MySql pour 5 fois et pour 1000 enregistrements, ce sera 1000 * 5 = 5000 requête en double.

Si j'utilise la pagination, alors aussi pour un minimum de 20 enregistrements 20 * 5 = 100 requêtes en double.

Utilisez le chargement hâtif si vous souhaitez résoudre les problèmes N + 1.

Voir cette démo pour ref: https://datatables.yajrabox.com/relation/belongs-to

Ou utilisez des instructions de jointure et incluez le statut de votre requête.

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 requête est si compliquée. Ne pensez pas que le chargement hâtif sera possible

Pour utiliser les fonctions getXYZ et setXYZ dans ajouter et éditer Column, nous avons obligatoirement besoin d'un objet Eloquent.

Ok ne s'attendait pas à une requête aussi compliquée. ^ _ ^

Vous pouvez envisager d'utiliser le cache alors? Si l'état ne change pas très souvent, vous pouvez également le définir pour une période plus longue.

-- Éditer --
Peut-être quelque chose comme:
`` `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);
})

J'espère que quelque chose comme ça serait là

Vous n'êtes pas vraiment sûr de votre suggestion setGlobal car vous auriez toujours besoin d'itérer sur chaque utilisateur pour pouvoir récupérer le statut, par conséquent, plusieurs appels de fonction seront toujours effectués.

Je cherche vraiment un moyen de me débarrasser de centaines de requêtes en double. juste parce que pour appeler getXYZ et setXYZ dans plus d'une colonne.

J'ai également le même problème et je souhaite utiliser une variable globale (commune) afin de pouvoir l'utiliser pour chaque itération en tant que variable commune
@ruchisheth Si vous avez quelque chose, veuillez partager votre réponse

Merci pour l'aide à l'avance .. :)

même @ruchisheth

@rajanjain et @haratmalli Je n'ai aucune solution pour cela.

salut as-tu essayé dans la première colonne de mettre

données-> statues = 4;

l'appeler lors du deuxième rappel?

Cette page vous a été utile?
0 / 5 - 0 notes