Laravel-datatables: 需要自定义下拉过滤器。

创建于 2017-10-25  ·  12评论  ·  资料来源: yajra/laravel-datatables

问题或功能要求摘要


我需要使用自定义下拉列表的数据过滤器。 我现在显示的数据格式正确,我需要在标头中添加自定义下拉列表,以便通过下拉列表值过滤数据[注意:我需要在laravel查询中提供此下拉列表值以进行过滤。 这是自定义值,因此我需要使用此自定义值过滤数据。]

问题的代码段

此代码适用于默认过滤器,但我已使用jquery添加了下拉列表,因此我需要在laravel查询中传递此值以过滤数据。

$(function () {
    var t = $('#user').DataTable({
        order: [[ 0, 'desc' ]],
        processing: true,
        serverSide: true,
        ajax: {
            url: '{!! route('datatables.data') !!}',
            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
            }
        },
        columns: [
            { data: 'id', name: 'id' },
            { data: 'name', name: 'name' },
            { data: 'email', name: 'email' },
            { data: 'arrival_date', name: 'arrival_date', orderable: true, searchable: true },
            { data: 'pick_up', name: 'pick_up', orderable: true, searchable: true },
            { data: 'destination', name: 'destination', orderable: true, searchable: true},
            { data: 'trekking_start_date', name: 'trekking_start_date', orderable: true, searchable: true},

            { data: 'trekking_end_date', name: 'trekking_end_date', orderable: true, searchable: true},
            { data: 'action', name: 'action', orderable: false, searchable: false},
        ]
    });
});

$(document).ready(function() {
    $('<label style="margin-left: 10px;">Filter by ' +
        '<select class="form-control input-sm">'+
            '<option value="volvo">Completed Trip</option>'+
            '<option value="saab">Upcoming Trip</option>'+
        '</select>' + 
        '</label>').appendTo("#user_wrapper #user_length");
});

还有我在laravel中的查询代码

public function getClients(Request $request)
    {
        if($request->ajax()) {
            return Datatables::of(DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC')))
                    //}))
                    ->addColumn('arrival_date', function($user){
                        if(isset(Helper::getFlightsByClientID($user->id)->arrival_date)) {
                            return date('M j, Y', strtotime(Helper::getFlightsByClientID($user->id)->arrival_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('pick_up', function($user){
                        if(isset(Helper::getFlightsByClientID($user->id)->pick_up)) {
                            return Helper::getFlightsByClientID($user->id)->pick_up == 1 ? 'Yes' : 'No'; 
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('destination', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_region_id)) {
                            return Helper::getTrekByID(Helper::getTreksByClientID($user->id)->trekking_region_id)->name; 
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('trekking_start_date', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_start_date)) {
                            return date('M j, Y', strtotime(Helper::getTreksByClientID($user->id)->trekking_start_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('trekking_end_date', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_end_date)) {
                            return date('M j, Y', strtotime(Helper::getTreksByClientID($user->id)->trekking_end_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('action', function($user){
                        $html = '';
                        $html .= '<a class="btn bg-green btn-flat btn-xs" href="'.route('user.clients.edit', $user->id).'">Edit</a>';

                        if(auth()->user()->hasRole('superadmin')) {
                            $html .= ' <a onclick="if(!confirm(\'Are u sure to delete?\')) return false;" class="btn bg-red btn-flat btn-xs" href="'.route('user.clients.delete', $user->id).'">Delete</a>';
                        }

                        return $html;

                    })
                    ->make(true);
        } else {
            abort(400, 'Bad Request.');
        }
    }

如果适用,请提供触发可疑错误的代码副本。 您可以使用markdown php代码标签格式化粘贴:md5-29f7d4c1ff52f0e396b313bfe2550e56

系统详情

请包括有关您的系统的这些详细信息! 如果省略它们,则该票证将优先于其他用户的请求/票证。
  • 操作系统Ubuntu 16.04
  • PHP版本7.0.22
  • Laravel 5.4版
  • Laravel-Datatables版本1.10.16

Screenshot

question

最有用的评论

更改滤镜时需要触发绘制。 也许像这样:

<select class="form-control input-sm" id="custom-filter" onchange="$('#user').DataTable().draw()">

另外,您正在使用集合。 兑换

DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC'))

像这样:

DB::table('users')->whereNot(...);

所有12条评论

@shankhadevpadam您可以通过多种方式执行此操作。 但是我要做的是在服务器端的数据表之前传递查询生成器。


$model = new Example();
$model->where('column_to_filter','=',$this->request->get('filter_by'));

return datatables()->eloquent($model);

您当然可以做条件IF。


$model = new Example();

if($this->request->has('name')) {
     $model->where('name','=','predefined value');
}

return datatables()->eloquent($model);

如果您不想执行上述示例,则可以参考文档。 列后搜索自定义过滤器

我的问题是如何像上面的图像一样绑定下拉菜单,我已经通过自定义jquery绑定了它,但是我需要使用数据表进行绑定,并且当更改下拉列表时此值应该可用。[请查看我的代码段]

在选择框中添加id

<select class="form-control input-sm" id="custom-filter">

然后将其包括在请求参数中。

        ajax: {
            url: '{!! route('datatables.data') !!}',
            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
                d.filter = $('#custom-filter').val();
            }
        },

然后在服务器端进行必要的筛选。

if ($filter = request('filter')) {
    $query->where('filter', $filter);
}

更改滤镜时需要触发绘制。 也许像这样:

<select class="form-control input-sm" id="custom-filter" onchange="$('#user').DataTable().draw()">

另外,您正在使用集合。 兑换

DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC'))

像这样:

DB::table('users')->whereNot(...);

感谢您现在的工作。

欢迎使用,如果发现有用,别忘了给项目加注星标。 :) 谢谢!

下拉列表可以正常工作,但是下拉列表中的值更改后的数据显示顺序不正确。

Screenshot

您想按过滤日期排序吗? 您需要在js级别上执行此操作。 或将默认顺序设置为该列。

是的,请举任何例子。

没有任何例子。 请参阅官方js api文档https://datatables.net/reference/api/以获取参考。 技巧是在执行表重绘功能之前执行手动js命令。

@yajra如何在数据表中实现等效服务?

            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
                d.filter = $('#custom-filter').val();
            }

@sistemaswebbrasil使用minifiedAjax()

$script = '
data.name = $('input[name=name]').val();
data.email = $('input[name=email]').val();
data.filter = $('#custom-filter').val();
';

return $this
            ->builder()
            ...
            ->minifiedAjax($url = '', $script = null, $data = [])
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

nasirkhan picture nasirkhan  ·  3评论

vipin733 picture vipin733  ·  3评论

Abdulhmid picture Abdulhmid  ·  3评论

shadoWalker89 picture shadoWalker89  ·  3评论

sangnguyenplus picture sangnguyenplus  ·  3评论