Laravel-datatables: функция быстрого поиска yajra Datatables не выполняет поиск

Созданный на 7 июн. 2016  ·  17Комментарии  ·  Источник: yajra/laravel-datatables

Добрый день!

У меня проблема с поиском записей в моих таблицах данных. Можно искать только столбец tracking_id. Мне нужно найти все столбцы.

Вот мой php-код запроса:

$result = Document::join('user','document.user_id','=','user.id')
->join('classification','document.classification_id','=','classification.id')
->select('document.id',DB::raw('CONCAT(document.tracking_type,"-",document.tracking_date,"-",document.tracking_seq_no) AS tracking_id'),'document.date_prepared','document.subject','classification.description as doc_class')
->orderBy('document.created_at','desc')->get();

return Datatables::collection($result)
->addColumn('check',function($record){
    return '<input type="checkbox" name="check['.$record->id.']" class="checkboxes" value='.$record->id.'>';})
->addColumn('action',function($record){
    return '<a href="/records/view/' . $record->tracking_id . '">View Record</a></a>';})
->addColumn('document.tracking_id',function($record){
    return $record->tracking_id;})
->editColumn('document.doc_class',function($record){
    return $record->doc_class;})
->addColumn('document.subject',function($record){
    return $record->subject;})
->addColumn('document.date_prepared',function($record){
    return date('F d, Y', strtotime($record->date_prepared));})
->make(true);

Декларация JS:

docstable = $('.docstable').DataTable({
    processing: true,
    serverSide: true,
    ajax: "/ajax/docrec"
    columnDefs: [
        {targets:[0,1], orderable:false}
    ],
    columns: [
        {data:'check'},
        {data:'action'},
        {data:'tracking_id',name:'document.tracking_id'},
        {data:'doc_class',name:'document.doc_class'},
        {data:'subject',name:'document.subject'},
        {data:'date_prepared',name:'document.date_prepared'}
    ]
});

Есть ли способ, подобный Bllim Datatables, который может искать все указанные столбцы с помощью searchColumns () в PHP-коде? Спасибо

question

Самый полезный комментарий

Привет, @ChaosPower, и большое спасибо за ответ.

Я попробовал ваше решение, но оно не сработало. На самом деле $this->mainRepo->model - это экземпляр моей модели из App \ Models. Он привязан к материалу mainRepo, но не связан с моей проблемой.
Я обновился, чтобы получить что-то вроде этого (из моего репозитория):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Я использую этот метод для управления всеми данными DataTables из моих моделей. Если переменная dataTable имеет значение false, порядок не применяется, и я использую select('*') .

В конце концов, цепной метод мог бы выглядеть так:
$this->model->with('relation')->select('*'); где $this->model - это App\Models\User .

Порядок столбцов теперь работает идеально, но текстовый поиск по умолчанию все еще не влияет на поиск. Все результаты отображаются независимо от моего ввода.
Я снова сделал что-то не так?

Мы видим здесь мой ввод для поиска, но возвращаются все мои 3 пользователя, даже если ввод «мое значение поиска» не должен возвращать вообще ничего.
capture

Спасибо большое за вашу помощь

Все 17 Комментарий

Быстрый поиск во всех столбцах поддерживается по умолчанию, но, поскольку вы используете запросы соединения, есть некоторые изменения в том, как вы должны объявлять имя в своем скрипте, как в этой демонстрации .

Кстати, почему используют коллекцию вместо красноречивого? Я предлагаю вам удалить get() в вашем запросе и использовать вместо него return Datatables::eloquent($result) ?

Здравствуйте !
Для меня глобальный поиск всегда возвращает пустой результат. Моя таблица данных пуста после поиска. Заполняется всеми данными, когда я удаляю все поисковые запросы.
Но я делаю это так просто:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

Я вижу в HTTP-запросе свой ввод для поиска, но результат строки всегда пуст. Нужно ли мне делать что-то на стороне сервера, чтобы разрешить глобальный поиск? Я думал, это автоматический ...
capture

Данные поступают из моего репозитория, в основном выполняя $ model-> get () без какого-либо упорядочивания / сортировки. Я подумал, что достаточно сделать глобальную фильтрацию текста и текст по столбцам. Но нужно ли мне реализовать решение для использования «где» в моем запросе Eloquent? Или лучше фильтровать с помощью метода фильтрации DataTables? (В случае, если ничего не происходит автоматически, и мне нужно сделать все на стороне сервера).

Но этот пример , и это один не осуществляют какой - либо обработки на стороне сервера, и получить глобальный поиск, даже в поисках колонки ... Я пробовал все эти примеры, но безуспешно: результат поиска всегда пустой, DataTable пуст сначала символа поиска отправить и снова заполнить всеми данными, когда фильтр вообще не заполнен ...

Основные вопросы: есть ли в пакете что-нибудь реализованное для фильтрации / поиска на стороне сервера из данных модели, или доступны только сортировка столбцов и разбивка на страницы?

Большое спасибо за чтение и вашу помощь!

PS: связан с моим комментарием # 562

@ mtx-z при вызове -> get () вы используете коллекции вместо объекта LDT.

$users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']); //Eloquent Object

$users->all(); // Collection

Laravel Datatables автоматически выполняет -> get (), и я советую вам не использовать -> get (), когда вы

return Datatables::of($users)->make(true);

Основываясь на вашем примере, вам не нужно -> get ()


$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

только


$users = $this->mainRepo->model; return Datatables::of($users)->make(true);

По вашему основному вопросу о фильтрации и поиске. Laravel Datatables уже реализует поиск по всем столбцам по умолчанию / на стороне сервера. А также поддерживает фильтрацию отдельных столбцов.

https://datatables.yajrabox.com/eloquent/basic - см. переданные заголовки
https://datatables.yajrabox.com/eloquent/multi-filter-select - см. переданные заголовки

Привет, @ChaosPower, и большое спасибо за ответ.

Я попробовал ваше решение, но оно не сработало. На самом деле $this->mainRepo->model - это экземпляр моей модели из App \ Models. Он привязан к материалу mainRepo, но не связан с моей проблемой.
Я обновился, чтобы получить что-то вроде этого (из моего репозитория):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Я использую этот метод для управления всеми данными DataTables из моих моделей. Если переменная dataTable имеет значение false, порядок не применяется, и я использую select('*') .

В конце концов, цепной метод мог бы выглядеть так:
$this->model->with('relation')->select('*'); где $this->model - это App\Models\User .

Порядок столбцов теперь работает идеально, но текстовый поиск по умолчанию все еще не влияет на поиск. Все результаты отображаются независимо от моего ввода.
Я снова сделал что-то не так?

Мы видим здесь мой ввод для поиска, но возвращаются все мои 3 пользователя, даже если ввод «мое значение поиска» не должен возвращать вообще ничего.
capture

Спасибо большое за вашу помощь

Я наконец сделал это :) ты

Я также внезапно не могу искать отношение, я использовал $ this-> model-> with ('Relationship') -> select ('*');
mtx-z поделишься решением?

Привет. Код, который я использовал, был специфическим для меня.
Модель this-> содержит экземпляр моей модели.

Вы можете предоставить свой код?

\\ In controller
$result = MsCustomer::with('company')->select('ms_customers.*');
return Datatables::of($result)->make(true);

\\ In view
$('#data-table').DataTable({
    ajax: '{!! route('master.customer.data') !!}',
    columns: [
        { data: 'id', name: 'id' },
        { data: 'code', name: 'code' },
        { data: 'name', name: 'name' },
        { data: 'email', name: 'email' },
        { data: 'company.name', name: 'company.name' },
   ]
});

Таблицы данных запускают и отображают данные, содержащие отношение company.name , но не могут выполнять поиск в отношении. Я думаю, код уже похож на эту демонстрацию

У меня есть модель MsCustomer с объявлением protected $ table = 'ms_customers', а также отношение "компания" внутри модели MsCustomer. Затем модель MsCompany с именем таблицы "ms_companies".

Я могу искать по идентификатору, коду, имени и электронной почте, но не по отношению «company.name». Что-то не так с приведенным выше кодом?

У меня такая же проблема с @maengkom , мой стол загружен нормально. но когда я ищу, результат всегда пуст

в контроллере

$agenda = AgendaMasuk::with('surat')
            ->whereNotNull('surat_id')->where('group_id', $group->id)
            ->select('agenda_masuks.*');
        return Datatables::of($agenda)->make(true);

с учетом

var table = $('#surats').DataTable({
        "jQueryUI"   : true,
        "paging"     : true,
        "lengthMenu" : [ 5, 10, 25, 50, 75, 100, "All" ],
        "autoWidth"  : false,
        "stateSave"  : false,
        "order"      : [[ 0, 'asc' ]],
        "processing" : true,
        "scrollX"    : true,
        "serverSide" : true,
        "ajax": {
            "url": $('#surats').data('url'),
            "type": "POST"
        },
        "columns": [
            {
                className: 'text-center',
                data: 'no_agenda',
                name: 'agenda_masuks.no_agenda'
            },
            {
                className: 'text-center',
                data: 'surat.no_surat',
                name: 'surat.no_surat'
            },
            {
                className: 'text-center',
                data: 'tanggal',
                name: 'agenda_masuks.tanggal'
            },
            {
                data: 'surat.sifat',
                name: 'surat.sifat',
                sortable: false
            },
            {
                data: 'surat.pengirim',
                name: 'surat.pengirim'
            },
            {
                data: 'surat.tujuan',
                name: 'surat.tujuan'
            },
            {
                data: 'surat.ringkasan',
                name: 'surat.ringkasan',
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'disposisi',
                searchable: false,
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'file',
                searchable: false,
                sortable: false
            }
        ]
    });

@maengkom У меня такая же проблема, я не смог использовать глобальный поиск по значениям объектов И значениям отношений (только по идентификатору).
Например, со всеми моими моделями связана «модель_переводчика». Которые содержат публичный текст и только он. Ну, моя таблица данных не может автоматически искать названия переводов.

Чтобы исправить это, я отредактировал вызов ajax, добавив некоторый параметр (текстовый поиск, выберите значение ...), и я использую эти значения для фильтрации красноречивого запроса перед его отправкой в ​​Datatable.
Отсюда вы можете фильтровать что угодно (в реальном случае это «где» с «тогда как перевод», где «translations.name = 'search_value'», поскольку это красноречиво.

@nsetyo вы проверили возвращенную коллекцию? Соответствуют ли данные в коллекции тем, что требуется для данных?

@ mtx-z да, это так. Я временно исправлю это, используя вместо этого запросы на соединение

@nsetyo @ mtx-z владелец уже подтвердил, что поисковая связь все еще содержит ошибку. проверьте это https://github.com/yajra/laravel-datatables/issues/698

Я пытаюсь помочь исправить это и все еще изучаю код метода фильтрации внутри пакета, но все еще путаю, где следует исправить 😆

Все мои поля поиска сейчас работают, но у меня осталась одна проблема. Основываясь на данной демонстрации Яджры (Владелец), в таблице есть поле Создано и Обновлено в. У меня также есть поле в моей таблице, отображающее дату и время, но дело в том, что если я отформатировал отображаемую дату и время так, чтобы они были удобочитаемы для пользователей, datatable не смог бы найти эти недавно отформатированные дату и время.

Пример: (отображается формат даты и времени по умолчанию)
2016-08-23 14:37:25

Я отформатировал это в:
23 АВГУСТА 2016 14:37:25

используя date('F d, Y h:i:s a',strtotime($the_given_date_and_time));

После форматирования datatable не смог выполнить поиск в этом поле.

Вы можете использовать filterColumn api, чтобы переопределить sql по умолчанию для поиска в столбце даты, чтобы соответствовать тому, что было отображено.

следовать https://datatables.yajrabox.com/eloquent/joins будет работать

Для addcolumn он должен быть доступен для поиска.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги