Laravel-datatables: ๋ชจ๋“  ํ–‰์— ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 07์›” 04์ผ  ยท  16์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: yajra/laravel-datatables

๋ฌธ์ œ ์š”์•ฝ ๋˜๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ

๋ชจ๋“  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'];

->

์‹œ์Šคํ…œ ์„ธ๋ถ€ ์ •๋ณด

  • ์šด์˜ ์ฒด์ œ
  • PHP ๋ฒ„์ „
  • ๋ผ ๋ผ๋ฒจ ๋ฒ„์ „
  • Laravel-Datatables ๋ฒ„์ „
question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ธ€๋กœ๋ฒŒ? ํด๋กœ์ €์— ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

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

๋ชจ๋“  16 ๋Œ“๊ธ€

๊ธ€๋กœ๋ฒŒ? ํด๋กœ์ €์— ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

$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

๋˜๋Š” ์กฐ์ธ ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฟผ๋ฆฌ์— ์ƒํƒœ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

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

์ฟผ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. 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;

๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ์—์„œ ํ˜ธ์ถœ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

techguydev picture techguydev  ยท  3์ฝ”๋ฉ˜ํŠธ

FilipeBorges1993 picture FilipeBorges1993  ยท  3์ฝ”๋ฉ˜ํŠธ

vipin733 picture vipin733  ยท  3์ฝ”๋ฉ˜ํŠธ

SGarridoDev picture SGarridoDev  ยท  3์ฝ”๋ฉ˜ํŠธ

kamrava picture kamrava  ยท  3์ฝ”๋ฉ˜ํŠธ