chikolokoy08 / dengine
Dengine - Laravel 的 Datatable 辅助工具。旨在实现更好的集成、数据清理和服务器端数据优化。这是 [DataTables](https://datatables.net.cn/manual/server-side) 库的替代服务器端处理实现。
dev-master
2023-12-22 12:59 UTC
Requires
- php: >=5.6
Suggests
- illuminate/support: Required for laravel service providers
This package is auto-updated.
Last update: 2024-09-22 14:30:11 UTC
README
旨在实现更好的集成、数据清理和 DataTable 服务器端数据的优化。这是与 DataTables 库匹配的替代服务器端处理实现。您可以根据自己的需求修改和改进任何特定方法。
安装
使用 composer 安装
composer require chikolokoy08/dengine dev-master
composer require chikolokoy08/dengine
Laravel(可选)
在 config/app.php
中添加服务提供者
Chikolokoy08\Dengine\DengineServiceProvider::class
并将 Dengine 别名添加到 config/app.php
'Dengine' => Chikolokoy08\Dengine\Facades\Dengine::class
基本实例
首先创建一个 Dengine
实例(如果您使用 Laravel,则可以使用 Dengine
Facade)
use Chikolokoy08\Dengine\Dengine; $dengine = new Dengine();
Eloquent 上的用法
public function getDatatableEvents(Request $request) { try { $inputs = $request->all(); $user_id = 1; $dengine = new Dengine(); $dengine::parse($inputs); //MODEL INSTANCE $model = new \App\Models\Event(); //TOTAL RECORDS QUERY $total = $model::where('user_id', $user_id)->where('target', 'like', '%'.$dengine::search_keyword().'%')->count(); //QUERY WITH FULL PARAMETERS $query = $model::where('user_id', $user_id)->where('target', 'like', '%'.$dengine::search_keyword().'%') ->skip($dengine::skip()) ->take($dengine::limit()) ->orderBy('column', $dengine::order_type()) ->get(); //SETTER FOR TOTAL $dengine::recordsTotal($total); //PREPARING QUERY RESULT INTO DATATABLE JSON FORMAT $dengine::prepare($query->toArray()); //RETURN AS JSON OBJECT return $dengine::make(); } catch (Exception $e) { \Log::error($e); } }
Active Records 上的用法
public function getDatatableEvents(Request $request) { try { $inputs = $request->all(); $user_id = 1; $dengine = new Dengine(); $dengine::parse($inputs); //MODEL INSTANCE $model = new \App\Models\Event(); $dtparams = $dengine::setParameters(['user_id' => $user_id]); //TOTAL RECORDS QUERY $total = count($model->eventQueryModel($dtparams)); //Change $dtparams['get_total'] false $dtparams['get_total'] = false; //QUERY WITH FULL PARAMETERS $query = $model->eventQueryModel($dtparams); //SETTER FOR TOTAL $dengine::recordsTotal($total); //PREPARING QUERY RESULT INTO DATATABLE JSON FORMAT $dengine::prepare($query); //BONUS: YOU CAN FORMAT RETURNED DATA ACCORDING TO YOUR REQUIREMENTS BEFORE RETURNING AS JSON OBJECT $dengine::add_column('formatted_date', function($row) { return date('d/m/Y', strtotime($row->date)); }); $dengine::add_column('user_display', function($row) use($user_id) { return "This is user #{$user_id}"; }); //RETURN AS JSON OBJECT return $dengine::make(); } catch (Exception $e) { \Log::error($e); } }
建议的模型结构
public function eventQueryModel($qp=[]) { try { $column_orderable = [ 'title', 'target', 'event_date']; $qp['column_text'] = $qp['column'] == '' ? $column_orderable[0] : $column_orderable[$qp['column']]; $qp['take'] = $qp['get_total'] == true || $qp['keyword'] != '' ? 5000000 : $qp['take']; $whereClauses = "t.user_id = {$qp['user_id']}"; //IF KEYWORD IS NOT EMPTY if (!empty($qp['keyword'])) { $whereClauses .= " AND ( t.title LIKE '%$keyword%' OR t.target LIKE '%$keyword%' OR t.date LIKE '%$keyword%')"; } $query = \DB::select(" SELECT t.id, t.user_id, t.title, t.target, DATE_FORMAT(t.date, '%d %M %Y') as event_date FROM {$this->table} as t WHERE {$whereClauses} GROUP BY t.id ORDER BY {$qp['column_text']} {$qp['order_type']} LIMIT {$qp['skip']}, {$qp['take']} "); return $query; } catch (Exception $e) { \Log::error($e); } }
建议的完整控制器
namespace App\Http\Controllers; use Chikolokoy08\Dengine\Dengine; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class DatatableController extends Controller { protected $dengine; public function __construct(Request $request) { try { $this->dengine = new Dengine(); $this->dengine::parse($request->all()); } catch (Exception $e) { \Log::error($e); } } public function getDatatableEvents(Request $request) { try { //MODEL INSTANCE $model = new \App\Models\Event(); $dtparams = $this->dengine::setParameters(['user_id' => $user_id]); //TOTAL RECORDS QUERY $total = $model->eventQueryModel($dtparams); //Change $dtparams['get_total'] false $dtparams['get_total'] = false; //QUERY WITH FULL PARAMETERS $query = $model->eventQueryModel($dtparams); //SETTER FOR TOTAL $this->dengine::recordsTotal($total); //PREPARING QUERY RESULT INTO DATATABLE JSON FORMAT $this->dengine::prepare($query); //BONUS: YOU CAN FORMAT FETCHED DATA ACCORDING TO YOUR REQUIREMENTS BEFORE RETURNING AS JSON OBJECT $this->dengine::add_column('formatted_date', function($row) { return date('d/m/Y', strtotime($row->date)); }); $this->dengine::add_column('user_display', function($row) use($user_id) { return "This is user #{$user_id}"; }); $this->dengine::add_column('actions', function($row) use($user_id) { return "<a class='edit-btn' href='#' data-id='{$user_id}'>Edit User</a>"; }); //RETURN AS JSON OBJECT return $this->dengine::make(); } catch (Exception $e) { \Log::error($e); } } }
返回的 JSON 格式
{ "draw":"1", "recordsTotal":0, "recordsFiltered":0, "server_cols":"", "data":[] }
注意,版本方法仍处于测试阶段,可能无法返回正确的结果。
许可证
Datatable Engine Laravel 采用 MIT 许可证(MIT) 许可。
## 支持
如果您有任何问题,请通过电子邮件发送至 cmabugay@gmail.com