Laravel-datatables: Нужен настраиваемый раскрывающийся фильтр.

Созданный на 25 окт. 2017  ·  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.');
        }
    }

Если возможно, включите копию своего кода, который запускает предполагаемую ошибку. Вы можете использовать теги 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()">

Кроме того, вы используете collection. Конвертировать

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, но мне нужно привязать его с помощью datatable, и это значение должно быть доступно при изменении раскрывающегося списка. [Пожалуйста, посмотрите мой фрагмент кода]

Добавьте 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()">

Кроме того, вы используете collection. Конвертировать

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 order вручную перед выполнением функции перерисовки таблицы.

@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 рейтинги