Добрый день!
У меня проблема с поиском записей в моих таблицах данных. Можно искать только столбец 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-коде? Спасибо
Быстрый поиск во всех столбцах поддерживается по умолчанию, но, поскольку вы используете запросы соединения, есть некоторые изменения в том, как вы должны объявлять имя в своем скрипте, как в этой демонстрации .
Кстати, почему используют коллекцию вместо красноречивого? Я предлагаю вам удалить get()
в вашем запросе и использовать вместо него return Datatables::eloquent($result)
?
Здравствуйте !
Для меня глобальный поиск всегда возвращает пустой результат. Моя таблица данных пуста после поиска. Заполняется всеми данными, когда я удаляю все поисковые запросы.
Но я делаю это так просто:
$users = $this->mainRepo->model->get();
return Datatables::of($users)->make(true);
Я вижу в HTTP-запросе свой ввод для поиска, но результат строки всегда пуст. Нужно ли мне делать что-то на стороне сервера, чтобы разрешить глобальный поиск? Я думал, это автоматический ...
Данные поступают из моего репозитория, в основном выполняя $ 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 пользователя, даже если ввод «мое значение поиска» не должен возвращать вообще ничего.
Спасибо большое за вашу помощь
Я наконец сделал это :) ты
Я также внезапно не могу искать отношение, я использовал $ 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 он должен быть доступен для поиска.
Самый полезный комментарий
Привет, @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 пользователя, даже если ввод «мое значение поиска» не должен возвращать вообще ничего.
Спасибо большое за вашу помощь