๋ชจ๋ addColumn () ๋ฐ editColumn () ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ํ
์ด๋ธ์ ๊ฐ ๋ฐ๋ณต๋ง๋ค ํ๋์ ๋ณ์๋ฅผ ์ค์ ํด์ผํฉ๋๋ค.
๊ฐ์ ๊ฒ
```
return Datatables :: of ($ users)
-> setGlobal (ํจ์ ($ user) {
$ status = getUserStatus ($ user-> id) ;
})
-> addColumn ( 'status', function ($ user) {
// return getUserStatus ($ user-> id);
$ status ๋ฐํ;
});
-> editColumn ( 'is_approved', function ($ user) {
// return getUserStatus ($ user-> id)? ํ์ ์ฌ์ค;
return ($ status)? ํ์ ์ฌ์ค;
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'];
->
๊ธ๋ก๋ฒ? ํด๋ก์ ์ ๋ณ์๋ฅผ ์ ๋ฌ ํ์๊ฒ ์ต๋๊น?
$status = getUserStatus($user->id);
return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
return $status;
});
๊ฐ ๋ฐ๋ณต์์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ฐ ์ฌ์ฉ์์ ๋ํด ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
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;
๊ฐ๋ฐ์๊ฐ ๊ฒํ ํ๊ธฐ ์ ์ ๋ฌธ์ ๋ฅผ ๋ซ์ง ๋ง์ญ์์ค.
๊ฐ ๋ฐ๋ณต์์ ์ํ๋ ๊ฒฝ์ฐ 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);
});
๊ฐ ์ถ๊ฐ ๋๋ ํธ์ง ์ด์ ๋ํด ๋์ผํ ํจ์๋ฅผ ํธ์ถํด์ผํฉ๋๋ค. MySql ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํ๋ฏ๋ก ๋์ผํ ํจ์๋ฅผ ์ฌ์ฉํ๋ 5 ๊ฐ์ ์ด์ด์๋ ๊ฒฝ์ฐ ํ ๋ฒ์ ๋ฐ๋ณต์์ ๋์ผํ MySql ์ฟผ๋ฆฌ๊ฐ 5 ๋ฒ ํธ์ถ๋๊ณ 1000 ๊ฐ์ ๋ ์ฝ๋์ ๋ํด 1000 * 5 = 5000 ์ค๋ณต ์ฟผ๋ฆฌ๊ฐ๋ฉ๋๋ค.
ํ์ด์ง์ ์ฌ์ฉํ๋ฉด ์ต์ 20 ๊ฐ์ ๋ ์ฝ๋์ ๋ํด์๋ 20 * 5 = 100 ๊ฐ์ ์ค๋ณต ์ฟผ๋ฆฌ๊ฐ ์์ต๋๋ค.
N + 1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฆ์๋ก๋๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ด ๋ฐ๋ชจ๋ฅผ ์ฐธ์กฐํ์ญ์์ค : https://datatables.yajrabox.com/relation/belongs-to
๋๋ ์กฐ์ธ ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ฟผ๋ฆฌ์ ์ํ๋ฅผ ํฌํจํฉ๋๋ค.
$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'),
]);
์ฟผ๋ฆฌ๋ ์ด๋ ๊ฒ ๋ณต์กํฉ๋๋ค. eager loading์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ๋ง์ญ์์ค.
์ด ์ถ๊ฐ ๋ฐ ํธ์ง ๋ด์์ getXYZ ๋ฐ setXYZ ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Eloquent ๊ฐ์ฒด๊ฐ ๋ฐ๋์ ํ์ํฉ๋๋ค.
Ok๋ ๊ทธ๋ ๊ฒ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ํ์ง ์์์ต๋๋ค. ^ _ ^
๊ทธ๋ ๋ค๋ฉด ์บ์ ์ฌ์ฉ์ ๊ณ ๋ คํ ์ ์์ต๋๊น? ์ํ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ๋ ๊ธด ๊ธฐ๊ฐ ๋์ ์ค์ ํ ์๋ ์์ต๋๋ค.
-- ํธ์งํ๋ค --
์๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
```php
function getUserStatus ($ id) {
return Cache :: remember ( 'user.status.'. $ id, 1, function ($ id) {
๋ฐํ ์ํ :: ์ฐพ๊ธฐ ($ id);
});
}
->setGlobal(function ($user){
//for $user->id = 1 //status = true
//for $user->id = 2 // status = false
$status = getUserStatus($user->id);
})
์ด์ ๊ฐ์ ๊ฒ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ๊ฐ ์ฌ์ฉ์๋ฅผ ๋ฐ๋ณตํด์ผํ๋ฏ๋ก ์ฌ๋ฌ ํจ์ ํธ์ถ์ด ๊ณ์ ์ํ๋๋ฏ๋ก ์ ์ setGlobal
์ ๋ํด ํ์คํ์ง ์์ต๋๋ค.
์๋ฐฑ ๊ฐ์ ์ค๋ณต ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐ ํ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ๋ ์ด์์ ์ด์์ getXYZ ๋ฐ setXYZ๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ๋ํ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ ์ญ (๊ณตํต) ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ฐ๋ณต๋ง๋ค ๊ณตํต ๋ณ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@ruchisheth ๋น์ ์ด ๋ฌด์ธ๊ฐ๋ฅผ ์ป์๋ค๋ฉด ๋น์ ์ ๋๋ต์ ๊ณต์ ํ์ญ์์ค
๋ฏธ๋ฆฌ ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค .. :)
๊ฐ์ @ruchisheth
@rajanjain ๋ฐ @haratmalli ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค.
์๋ ํ์ธ์ ์ฒซ ๋ฒ์งธ ์ด์ ๋ฃ์ด ๋ณด์ จ๋์?
data-> statues = 4;
๋ ๋ฒ์งธ ์ฝ๋ฐฑ์์ ํธ์ถ ํ์๊ฒ ์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธ๋ก๋ฒ? ํด๋ก์ ์ ๋ณ์๋ฅผ ์ ๋ฌ ํ์๊ฒ ์ต๋๊น?