bllim / datatables
Laravel 4 DataTables Jquery 插件的服务端处理程序
Requires
- php: >=5.3.0
- illuminate/database: >=4.0.0
- illuminate/filesystem: >=4.0.0
- illuminate/support: >=4.0.0
- illuminate/view: >=4.0.0
Requires (Dev)
- laravel/laravel: >=4.0.0
- mockery/mockery: 0.7.2
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-14 13:59:04 UTC
README
项目目前没有活跃维护。
你很可能会在这里找到一个维护更活跃的分支: https://github.com/yajra/laravel-datatables
如果你有问题,请尝试修复它们,如果我们能验证它们可以正常工作,我们将拉取更改。话虽如此,这个项目缺乏自动测试,因此它已经成为一个难以维护的项目。如果你对这个项目感兴趣并愿意维护它,它仍然非常有用。60% 的时间,它都能正常工作。
Laravel 4 的 DataTables 扩展包
关于
本扩展包旨在通过使用 Eloquent ORM 或 Fluent 查询构建器来处理 DataTables Jquery 插件(https://datatables.net.cn)的服务端处理。
功能概述
- 支持 Eloquent ORM 和 Fluent 查询构建器
- 添加或编辑列内容,删除列
- 通过 Blade 模板引擎模板化新列或现有列
- 自定义列搜索
安装
在 composer.json 中要求 bllim/datatables
并运行 composer update
。
{
"require": {
"laravel/framework": "4.0.*",
...
"bllim/datatables": "*"
}
...
}
Composer 会下载该包。包下载完成后,打开 app/config/app.php
并添加以下服务提供者和别名
'providers' => array(
...
'Bllim\Datatables\DatatablesServiceProvider',
),
'aliases' => array(
...
'Datatables' => 'Bllim\Datatables\Facade\Datatables',
),
最后,您需要通过运行以下 Artisan 命令来发布配置文件。
$ php artisan config:publish bllim/datatables
使用方法
使用此扩展包非常简单。只需创建自己的 fluent 查询对象或 eloquent 对象,不获取结果(这意味着不要使用 get()、all() 或类似方法),并将其传递给 DataTables。您可以使用 Eloquent ORM 和 Fluent 查询构建器的所有功能。
您需要注意的一些事情
- 当您在 Eloquent 或 Fluent 查询上调用
select
方法时,您选择列。 - 修改列
- 您可以通过使用
edit_column($column, $content)
轻松编辑列 - 您可以使用
remove_column($column)
删除任何列 - 您可以使用
add_column($column_name, $content, $order)
添加列 - 您可以在
$content
值中使用 Blade 模板引擎。 - 您可以将函数作为 $content 传递给
add_column
或edit_column
调用。函数接收一个参数:查询行/模型记录。(见示例 2)
- 您可以通过使用
- 列标识符由返回的数组设置。
- 这意味着,对于
posts.id
相关的标识符是id
,而对于owner.name as ownername
是ownername
- 这意味着,对于
- 您可以使用
set_index_column($name)
使用set_index_column($name)
设置“索引”列(https://datatables.net.cn/reference/api/row().index()) - 您可以使用
set_row_class($content)
函数为每一行添加类(DT_RowClass)。 - 您可以使用
set_row_data($name,$content)
函数为每一行添加 jQuery 的数据(DT_RowData)。 - 您可以为每一列添加自定义搜索过滤器,以覆盖默认的搜索功能
- 您可以通过调用
make(true)
返回对象数组而不是数组数组。(见示例 4)
示例
示例 1:简单使用
$posts = Post::select(array('posts.id','posts.name','posts.created_at','posts.status'));
return Datatables::of($posts)->make();
示例 2:添加和编辑列
$place = Place::left_join('owner','places.author_id','=','owner.id')
->select(array('places.id','places.name','places.created_at','owner.name as ownername','places.status'));
return Datatables::of($place)
->add_column('operations', '<a href="{{ URL::route( \'admin.post\', array( \'edit\',$id )) }}">edit</a>
<a href="{{ URL::route( \'admin.post\', array( \'delete\',$id )) }}">delete</a>
')
->edit_column('status', '{{ $status ? 'Active' : 'Passive' }}')
->edit_column('ownername', function($row) {
return "The author of this post is {$row->ownername}";
})
->remove_column('id')
->make();
注意:如果在 add_column
或 edit_column
调用中赋值给 $content 时使用双引号,应使用反斜杠 (\) 转义变量以防止错误。例如
edit_column('id', "{{ \$id }}") .
示例 3:使用 filter_column
$clients = Client::select(array(
'Client.id',
DB::raw('CONCAT(Client.firstname," ",Client.lastname) as ClientName'),
'Client.email',
'Client.code',
'Client.updated_at',
'Client.isActive',
'Language.name as LanguageName',
))
->leftJoin('Language', 'Client.Language_id', '=', 'Language.id')
->where('isDeleted', '!=', '1');
return Datatables::of($clients)
->filter_column('id', 'where', 'Client.id', '=', '$1')
->filter_column('code', 'where', 'Client.code', '=', DB::raw('UPPER($1)'))
->filter_column('LanguageName', 'whereIn', 'Language.name', function($value) { return explode(',',$value); })
->filter_column('updated_at', 'whereBetween', 'Client.updated_at', function($value) { return explode(',',$value); }, 'and')
->edit_column('isActive', '@if($isActive) <span class="label label-success">Active</span> @else <span class="label label-danger">Inactive</span> @endif')
->make();
关于 filter_column 的说明
用法: filter_column ( $column_name, $method, $param_1, $param_2, ..., $param_n )
$column_name
- 应用搜索过滤器的列名$method
- 可以是QueryBuilder方法之一(where, whereIn, whereBetween, having等)。- 注意:对于全局搜索,这些方法将自动转换为它们的“或”等效方法(如果适用,如果不适用,则该列不会被搜索)。
- 如果您不希望在全局搜索中搜索某些列,请将最后一个参数设置为“and”(参见上面示例的第17行)。这样做后,过滤器不能切换到其“或”等效方法,因此不会在全局搜索中搜索。
$param_1 ... $param_n
- 这些是传递给所选where函数($method
)的参数。可能类型字符串
DB::raw()
- DB::raw()可以将任何内容输出到查询中。例如,子查询或分支,如果您需要一些非常复杂的where。- 函数 - 或任何其他可调用对象
- 上述任何一种类型的数组
- 搜索值通过在参数中放置字符串
$1
传递给查询。如果使用可调用对象(函数),则搜索值作为第一个参数传递给可调用对象(再次参见第17行)。- 可调用对象必须返回一个值,该值将被传递给QueryBuilder的函数。
示例4:返回对象数组
$posts = Post::select(array('posts.id','posts.name','posts.created_at','posts.status'));
return Datatables::of($posts)->make(true);
这返回一个如下所示的JSON数组
data: {
{
id: 12,
name: 'Dummy Post',
created_at: '1974-06-20 13:09:51'
status: true
}
{
id: 15,
name: 'Test post please ignore',
created_at: '1974-06-20 13:15:51',
status: true
}
}
示例5:DT_RowID、DT_RowClass和DT_RowData
$todo = ToDoList::select(array('todo.id','todo.name','todo.created_at','todo.status')); return Datatables::of($todo) ->set_index_column('id') ->set_row_class('@if($status=="done") success @endif') ->set_row_data('created_at','{{$created_at}}') ->make();
示例6:dataFullSupport的扩展使用
为了更好地利用dataTables mData (1.9)和现在columns.data (1.10)功能,您可以通过在配置文件中将其设置为true或通过将true传递给第二个初始化参数Datatables::of($query, true)
来启用dataFullSupport。
创建一个包含可搜索和可排序的联合表的表格
//html <table id="user-list"></table> //script.js $("#users-list").dataTable({ "processing": true, "serverSide": true, "ajax": "/api/user/datatables", "order": [[1,'desc']], "columnDefs": [ { //this prevents errors if the data is null "targets": "_all", "defaultContent": "" } ], "columns": [ //title will auto-generate th columns { "data" : "id", "title" : "Id", "orderable": true, "searchable": false }, { "data" : "profile.last_name","title" : "Name", "orderable": true, "searchable": true }, { "data" : "username", "title" : "Username", "orderable": true, "searchable": true }, { "data" : "email", "title" : "Email", "orderable": true, "searchable": true }, { "data" : "created_date", "title" : "Created", "orderable": true, "searchable": true }, ] });
$users = Models\User::select()->ModelJoin('profile'); return $dataTables = Datatables::of($users) ->filter_column('profile.last_name','where',\DB::raw('CONCAT(profile.last_name,\' \',profile.first_name)'),'LIKE','$1') ->filter_column('created_at','where','users.created_at','LIKE','$1') //for the blade template only the array data results is provided, it is `extracted` into the template ->edit_column('profile.last_name', '{{ $profile["first_name"]." ".$profile["last_name"] }}') ->edit_column('created_at', function($result_obj) { //in a callback, the Eloquent object is returned so carbon may be used return $result_obj->created_at->format('d/m/Y - h:ia'); }) ->add_column('manage', '<a href="/user/edit/{{$id}}" >Edit</a>', 3) ->remove_column('profile.photo_id') ->set_index_column('row-{{ $id }}') ->make();
//helper scope method in base Model class public function scopeModelJoin($query, $relation_name, $operator = '=', $type = 'left', $where = false) { $relation = $this->$relation_name(); $table = $relation->getRelated()->getTable(); $one = $relation->getQualifiedParentKeyName(); $two = $relation->getForeignKey(); if (empty($query->columns)) { $query->select($this->getTable().".*"); } //$join_alias = $table; $prefix = $query->getQuery()->getGrammar()->getTablePrefix(); $join_alias = $relation_name; foreach (\Schema::getColumnListing($table) as $related_column) { $query->addSelect(\DB::raw("`$prefix$join_alias`.`$related_column` AS `$join_alias.$related_column`")); } $two = str_replace($table . ".", $join_alias . ".", $two); return $query->join("$table AS $prefix$relation_name", $one, $operator, $two, $type, $where); //->with($relation_name); }
关于columns.data的说明
- 当使用columns.data选项时,返回数据的顺序并不重要。
- 您可能返回一些额外的行,这些行在某个表中使用,而不使用的行,无需担心忽略它们。
- 当数据在嵌入式数组中返回时,datatables允许您使用点符号访问它。这允许columns.data元素指向表中的项目。数据项的值应与表的列(或别名)相匹配。例如,如果您按"profile.last_name"排序,它将使用该排序方式来按"profiles"表中的last_name列排序,因此请确保该表已联合,以便存在引用。
- 如果您不进行直接联合,则无法对那些列进行排序或搜索,因此请确保在列数组中将这些选项设置为false。
- 如果您通过Eloquent预加载数据,您仍然会得到那些项目,并且可以通过edit_column进行编辑,无需对名称进行别名处理。
许可证:许可协议为MIT许可证