Saya perlu menetapkan satu variabel di setiap iterasi tabel data yang digunakan semua fungsi addColumn () dan editColumn ().
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'];
->
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.
$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?
Komentar yang paling membantu
global? hanya meneruskan variabel pada penutupan?