Laravel-datatables: Wie kann ich eine globale Variable für alle Zeilen zuweisen?

Erstellt am 4. Juli 2017  ·  16Kommentare  ·  Quelle: yajra/laravel-datatables

Zusammenfassung des Problems oder der Funktionsanforderung

Ich muss eine Variable bei jeder Iteration der Datentabelle festlegen, um alle Funktionen addColumn () und editColumn () zu verwenden.

Code-Snippet des Problems

So etwas wie
`` `
Rückgabe von Datatables :: of ($ users)
-> setGlobal (Funktion ($ user) {
$ status = getUserStatus ($ user-> id) ;
})
-> addColumn ('status', Funktion ($ user) {
// getUserStatus zurückgeben ($ user-> id);
$ status zurückgeben;
});
-> editColumn ('is_approved', Funktion ($ user) {
// getUserStatus zurückgeben ($ user-> id)? wahr falsch;
return ($ status)? wahr falsch;


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

->

Systemdetails

  • Betriebssystem
  • PHP-Version
  • Laravel Version
  • Laravel-Datatables Version
question

Hilfreichster Kommentar

global? Übergeben Sie die Variable einfach beim Schließen?

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

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

Alle 16 Kommentare

global? Übergeben Sie die Variable einfach beim Schließen?

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

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

Ich möchte, dass sich der Status in jeder Iteration ändert
Für jeden Benutzer sollte es sich ändern.

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;

Bitte schließen Sie das Problem nicht vor der Überprüfung durch den Entwickler.

Wenn Sie es bei jeder Iteration möchten, ist es nicht 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);
});

Für jede Spalte zum Hinzufügen oder Bearbeiten muss dieselbe Funktion aufgerufen werden. Dadurch wird die MySql-Abfrage aufgerufen. Wenn ich also 5 Spalten habe, die dieselbe Funktion verwenden, wird in einer Iteration dieselbe MySql-Abfrage 5 Mal und für 1000 Datensätze 1000 * 5 = 5000 doppelte Abfrage aufgerufen.

Wenn ich Paging verwende, dann auch für mindestens 20 Datensätze 20 * 5 = 100 doppelte Abfragen.

Verwenden Sie eifriges Laden, wenn Sie N + 1-Probleme lösen möchten.

Siehe diese Demo für Ref: https://datatables.yajrabox.com/relation/belongs-to

Oder verwenden Sie Join-Anweisungen und geben Sie den Status in Ihre Abfrage ein.

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

Die Abfrage ist so kompliziert. Denken Sie nicht, dass eifriges Laden möglich sein wird

Um die Funktionen getXYZ und setXYZ in der Spalte add and edit zu verwenden, benötigen wir zwingend ein Objekt von Eloquent.

Ok, ich hatte nicht mit dieser komplizierten Abfrage gerechnet. ^ _ ^

Kann dann die Verwendung eines Caches in Betracht ziehen? Wenn sich der Status nicht sehr oft ändert, können Sie ihn auch für einen längeren Zeitraum festlegen.

- Bearbeiten -
Vielleicht so etwas wie:
`` `php
Funktion getUserStatus ($ id) {
Rückgabe Cache :: Remember ('user.status.'. $ id, 1, Funktion ($ id) {
return Status :: find ($ id);
});
}}

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

Hoffe auf so etwas wäre da

Ich bin mir Ihres Vorschlags setGlobal nicht wirklich sicher, da Sie immer noch jeden Benutzer iterieren müssten, um den Status abrufen zu können. Daher werden weiterhin mehrere Funktionsaufrufe ausgeführt.

Ich suche wirklich nach einem Ausweg, um Hunderte von doppelten Abfragen loszuwerden. nur weil getXYZ und setXYZ in mehr als einer Spalte aufgerufen werden sollen.

Ich habe auch das gleiche Problem und möchte eine globale (gemeinsame) Variable verwenden, damit ich sie für jede Iteration als gemeinsame Variable verwenden kann
@ruchisheth Wenn Sie etwas haben, teilen Sie bitte Ihre Antwort

Danke für die Hilfe im Voraus .. :)

gleiche @ruchisheth

@rajanjain und @haratmalli Ich habe keine Lösung dafür.

Hallo, hast du versucht, in der ersten Spalte zu setzen

Daten-> Statuen = 4;

beim zweiten Rückruf anrufen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen