โดยปกติของมนุษย์ 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 แล้ว มันมีประสิทธิ์ภาพมากกว่า