Laravel-datatables: Bagaimana saya dapat menetapkan variabel Global untuk semua baris.

Dibuat pada 4 Jul 2017  ·  16Komentar  ·  Sumber: yajra/laravel-datatables

Ringkasan masalah atau permintaan fitur

Saya perlu menetapkan satu variabel di setiap iterasi tabel data yang digunakan semua fungsi addColumn () dan editColumn ().

Potongan kode masalah

Sesuatu seperti
``
return Datatables :: of ($ users)
-> setGlobal (function ($ user) {
$ status = getUserStatus ($ user-> id) ;
})
-> addColumn ('status', function ($ user) {
// return getUserStatus ($ user-> id);
return $ status;
});
-> editColumn ('is_approved', function ($ user) {
// return getUserStatus ($ user-> id)? benar salah;
kembali ($ status)? benar salah;


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

->

Detail sistem

  • Sistem operasi
  • Versi PHP
  • Versi Laravel
  • Versi Laravel-Datatables
question

Komentar yang paling membantu

global? hanya meneruskan variabel pada penutupan?

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

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

Semua 16 komentar

global? hanya meneruskan variabel pada penutupan?

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

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

Saya ingin status berubah di setiap iterasi
Untuk setiap pengguna itu harus berubah.

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;

tolong jangan tutup masalah sebelum tinjauan pengembang.

Jika Anda menginginkannya di setiap iterasi maka itu bukan 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);
});

Untuk setiap kolom tambah atau edit saya perlu memanggil fungsi yang sama. yang akan membuat panggilan ke kueri MySql jadi jika saya memiliki 5 kolom menggunakan fungsi yang sama ini maka Dalam satu iterasi panggilan kueri MySql yang sama sebanyak 5 kali dan untuk 1000 catatan akan menjadi 1000 * 5 = 5.000 kueri duplikat.

Jika saya menggunakan paging maka juga untuk minimal 20 catatan 20 * 5 = 100 kueri duplikat.

Gunakan eager loading jika Anda ingin menyelesaikan masalah N + 1.

Lihat demo ini untuk referensi: https://datatables.yajrabox.com/relation/belongs-to

Atau gunakan pernyataan gabungan dan sertakan status pada kueri Anda.

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

Pertanyaan ini sangat rumit. Jangan berpikir bahwa eager loading akan mungkin dilakukan

Untuk menggunakan fungsi getXYZ dan setXYZ di dalam kolom add dan edit, kita wajib membutuhkan objek Eloquent.

Ok tidak mengharapkan kueri yang rumit itu. ^ _ ^

Bolehkah mempertimbangkan untuk menggunakan cache? Jika status tidak terlalu sering berubah, Anda juga dapat mengaturnya untuk jangka waktu yang lebih lama.

- Edit -
Mungkin sesuatu seperti:
`` php
function getUserStatus ($ id) {
return Cache :: ingat ('user.status.'. $ id, 1, function ($ id) {
kembali Status :: temukan ($ id);
});
}

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

Berharap sesuatu seperti ini akan ada di sana

Tidak terlalu yakin dengan saran Anda setGlobal karena Anda masih perlu mengulang pada setiap pengguna untuk dapat mengambil status sehingga pemanggilan beberapa fungsi akan tetap dilakukan ..

Saya benar-benar mencari jalan keluar untuk menyingkirkan 100 kueri duplikat. hanya karena memanggil getXYZ dan setXYZ di lebih dari satu kolom.

Saya juga memiliki masalah yang sama dan ingin menggunakan variabel global (umum) sehingga saya dapat menggunakannya untuk setiap iterasi sebagai variabel umum
@ruchisheth Jika Anda punya sesuatu, silakan bagikan jawaban Anda

Terima kasih atas bantuannya sebelumnya .. :)

sama @ruchisheth

@rajanjain dan @haratmalli Saya belum punya solusi untuk ini.

hai apakah Anda mencoba di kolom pertama untuk meletakkan

data-> patung = 4;

panggil di panggilan balik kedua?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

t0n1zz picture t0n1zz  ·  3Komentar

hari-web picture hari-web  ·  3Komentar

shadoWalker89 picture shadoWalker89  ·  3Komentar

alejandri picture alejandri  ·  3Komentar

kamrava picture kamrava  ·  3Komentar