bllim/datatables

Laravel 4 DataTables Jquery 插件的服务端处理程序

v1.5.0-alpha 2015-02-12 17:47 UTC

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_columnedit_column 调用。函数接收一个参数:查询行/模型记录。(见示例 2)
  • 列标识符由返回的数组设置。
    • 这意味着,对于 posts.id 相关的标识符是 id,而对于 owner.name as ownernameownername
  • 您可以使用 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_columnedit_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许可证