Laravel-datatables: ๋งŽ์€ ์ˆ˜์˜ ํ–‰์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ ๋กœ๋“œ๊ฐ€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

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

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


Laravel์„ ์‚ฌ์šฉํ•˜์—ฌ Datatable์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ Datatable์ด ํ•˜๋‚˜์˜ ์š”์ฒญ์—์„œ ALL์„ ์–ป์€ ๋‹ค์Œ ํŽ˜์ด์ง€ ๋งค๊น€์ด JS ์ธก์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ”์— ๋งŽ์€ ์ˆ˜์˜ ํ–‰์ด ์žˆ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Laravel ํŽ˜์ด์ง€ ๋งค๊น€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด Eloquent์—์„œ ajax ๋ฐฉ๋ฒ•์œผ๋กœ paginate() ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋งค๊น€ ํ–‰์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋‚ด ํ”„๋กœ์ ํŠธ์— ํฐ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์ด ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์›Œ๋“œ ํ”„๋กœ์„ธ์‹ฑ๋„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋งค์šฐ ๋Š๋ฆฌ๊ณ  sort , search ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ž‘์—… ํ›„์— ํŽ˜์ด์ง€๊ฐ€ ์ •์ง€๋˜๊ณ  ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ

                serverSide: true,
                processing: true,
                render: true,
                columns: [
                    {data: 'code'},
                    {data: 'name', "defaultContent": "<i>Not set</i>"},
                    {data: 'native_name',  "defaultContent": "<i>Not set</i>"},
                    {data: 'action'}
                ],
                ajax: '{!! route('dt-languages') !!}'

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

  • ์šด์˜ ์ฒด์ œ ๋ฆฌ๋ˆ…์Šค
  • PHP ๋ฒ„์ „ 7.0.4
  • ๋ผ๋ผ๋ฒจ ๋ฒ„์ „ 5.4
  • Laravel-Datatables ๋ฒ„์ „ 7.2

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

์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด get์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

return $this->languages->select('languages.*');

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

์ฟผ๋ฆฌ ๋Œ€์‹  ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  LanguageRepository.php์— ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
return $this->languages->select('languages.*')->get();

์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด get์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

return $this->languages->select('languages.*');

์Šน์ธ. ์ด์ œ ๋” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์“ธ ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์‚ฌ์ด์— ๋˜ โ€‹โ€‹ํ•˜๋‚˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋‹จ์–ด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'languages.action' in 'where clause' (SQL: select count(*) as aggregate from (select '1' as `row_count` from `languages` where (LOWER(`languages`.`name`) LIKE %m% count_row_table)

์—ด์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฏ€๋กœ ์ž‘์—…์„ ๊ฒ€์ƒ‰/์ฃผ๋ฌธ ๋ถˆ๊ฐ€๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! @์•ผ์ฆˆ๋ผ
ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ:

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ:
select count(*) as aggregate from (select '1' as row_count from languages where languages.deleted_at is null and languages.deleted_at is null) count_row_table -> 3.64ms

๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ:
select languages.* from languages where languages.deleted_at is null order by code asc limit 10 offset 0 -> 1.05ms

๋„์›€์„ ์ฃผ์‹  @yajra ์—๊ฒŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๋‹ค๋‹ˆ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค! ๊ฐ์‚ฌ ํ•ด์š”!

๋‚˜๋Š” ๋ฌธ์ œ๋กœ ๊ณ ํ†ต ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Š๋ฆฐ ๋ Œ๋”๋ง. ๋‚ด ์„œ๋ฒ„ ์ธก ์ฟผ๋ฆฌ.

 $products = DB::connection("mysql2")->table('products')->
        join('products_description', 'products.products_id', '=', 'products_description.products_id')
            ->select(['products.products_id', 'products_description.products_name', 'products.products_isbn13', 'products.products_distributor', 'products.products_price', 'products.products_status']);
 return Datatables::of($products)->make(true);

๋„์™€์ฃผ์„ธ์š”. ํŽ˜์ด์ง€ ๋งค๊น€์„ ์œ„ํ•ด ๋‚˜๋งŒ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?
4,000,000๊ฐœ ์ด์ƒ์˜ ์ œํ’ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
@yajra ๋„์™€์ฃผ์‹œ๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ์ด๊ฒƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ๋งค๊น€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ฟผ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์š”์ฒญ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@pnghai ์–ด๋–ป๊ฒŒ ํ™•์ธํ•˜๋‚˜์š”?

@hsali ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์ง“ ๊ฒฝ๋ณด. ๋‚ด ๋…ผ๋ฆฌ์— ์›๊ฒฉ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ๋ง‰๋‹ค๋ฅธ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ๊ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ 404 ์—ฐ๊ฒฐ์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜์—ฌ ๋ ˆ์ฝ”๋“œ ์ˆ˜ * 60(์‹œ๊ฐ„ ์ดˆ๊ณผ ์ „ ์ดˆ)์„ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋…ผ๋ฆฌ๋ฅผ ์ผ์‹œ ์ค‘๋‹จํ–ˆ๊ณ  ์ง€๊ธˆ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
(p/s: pnghai nick์€ ๋‚˜ ์ž์‹ ์˜ ๋˜ ๋‹ค๋ฅธ github ๊ณ„์ •์ž…๋‹ˆ๋‹ค)

@pnghai ์–ด๋–ป๊ฒŒ ํ™•์ธํ•˜๋‚˜์š”?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ?

๋กœ๋”ฉ์ด ๋Š๋ฆฐ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ ๊ธฐ๋Šฅ์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๊ฐ€์ ธ์˜จ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์ผ์ข…์˜ ๋ฃจํ”„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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