ป้ายกำกับ: Eloquent ORM

Laravel: DataTables & EloquentLaravel: DataTables & Eloquent

โดยปกติของมนุษย์ framework ถ้าเขียน Laravel และใช้ DataTables โดยปกติจะใช้ Laravel DataTables Documentation หรือ ที่ใน composer คือ composer require yajra/laravel-datatables:^11.0 แต่คิดว่า รูปแบบเงื่อนไขที่ต้องการ เขียนเองโดยใช้ Laravel กับ Eloquent น่าจะได้ตามที่ต้องการมากกว่า เลยเขียนมันเอง น่าจะถูกใจมากกว่า

ก่อนอื่นต้องเข้าใจว่า DataTable มีการ รับส่งข้อมูลเป็น rest api ง่าย ๆ ตามคู่มือ Server-side processing ถ้าส่งข้อมูลได้ตรงกับที่ต้องการ มันก็ทำงานได้ ตัว library ด้านบนมันก็ทำงานแบบนี้ เราสามารถแก้ laravel Controller ได้เหมือนกัน

 /**
  * Display a listing of the resource.
  */
 public function index(Request $request)
 {
  if ($request->ajax()) {
   $json = [
    'data' => [],
    'draw' => $request->input('draw', 1),
    'recordsFiltered' => 0,
    'recordsTotal' => 0,
   ];

   $query = Ticket::query();
   $json['recordsTotal'] = $query->count();

   if ($request->has('search') && !empty($request->search)) {

    if (!empty($request->search['id']) && is_int((int) $request->search['id'])) {
     $query->where('id', (int) $request->search['id']);
    }

    if ($request->search['category_id'] && is_int((int) $request->search['category_id'])) {
     $query->where('category_id', $request->search['category_id']);
    }

    if ($request->search['service_lines_id'] && is_int((int) $request->search['service_lines_id'])) {
     $query->where('service_lines_id', $request->search['service_lines_id']);
    }

    if ($request->search['status_id'] && is_int((int) $request->search['status_id'])) {
     $query->where('status_id', $request->search['status_id']);
    }

    if ($request->search['support_engineer_id'] && is_int((int) $request->search['support_engineer_id'])) {
     $query->where('support_engineer_id', $request->search['support_engineer_id']);
    }

   }

   $json['data'] = $query->get()->map(function ($ticket) {
    return [
     'id' => $ticket->id,
     'category_id' => $ticket->category_id,
     'vessel_id' => $ticket->vessel_id,
     'service_lines_id' => $ticket->service_lines_id,
     'support_engineer_id' => $ticket->support_engineer_id,
     'sla_dt' => $ticket->sla_dt,
     'working_time' => $ticket->working_time,
    ];
   })
    ->skip(request()->input('start', $request->input('start', 0)))
    ->take(request()->input('length', $request->input('length', -1)))
    ->toArray();

   $json['recordsFiltered'] = $query->count();

   return response()->json($json);
  } else {
   return view('tickets.index', ['title' => 'Tickets List']);
  }
 }

อธิบาย

  • บรรทัดที่ 4 เลือก function ที่ผูกกับ route ที่ต้องการ อย่าง index
  • บรรทัดที่ 6 คือ จะแยก URL เดียวกัน ถ้าเข้ามาโดยใช้ AJAX หรือ เปิดหน้าเว็บธรรมดา
    • มาจาก AJAX ก็จะส่งกลับเป็น JSON
    • มาจาก browser ก็ส่ง view ที่มี Datatable ไป
  • บรรทัดที่ 17 เป็นการเพิ่ม filter query เพิ่มตามเงื่อนไข
  • บรรทัดที่ 41 ตรงนี้จะเป็นการเพิ่ม column และมีการ map relational table เข้ามาจาก ตารางอื่น ๆ

อาจจะดูว่ามันซับซ้อน แต่วิธีนี้ มันควบคุมง่ายกว่า การใช้ library สำเร็จรูป และดูจาก sql query แล้ว มันมีประสิทธิ์ภาพมากกว่า