Laravel-datatables: yajra Datatables快速搜索功能未搜索

创建于 2016-06-07  ·  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的方法可以通过使用php代码中的searchColumns()搜索所有指定的列? 谢谢

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->modelApp\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()而不进行任何排序/排序。 我认为足以进行一些全局和列文本过滤。 但是,我是否需要实现在口才要求中使用“ where”的解决方案? 还是使用DataTables过滤方法更好地进行过滤? (在没有自动的情况下,我需要在所有服务器端进行操作)。

这个例子这个没有实现任何服务器端处理,并获得了全局搜索,甚至每列搜索...我尝试了所有这些例子,都没有成功:搜索结果总是空的,数据表是在第一次搜索字符空提交,然后在完全不填写过滤器的情况下回填所有数据...

基本问题是:软件包中是否有任何实现的用于从Model Datas进行服务器端筛选/搜索的内容,或者仅存在可用的列排序和分页?

非常感谢您的阅读和帮助!

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->modelApp\Models\User

列排序现在可以正常工作,但是默认的文本搜索仍然对搜索没有影响。 显示的所有结果均不取决于我的输入。
我又做错了什么吗?

我们在这里看到了我的搜索输入,但是即使“我的搜索值”输入什么也不返回,我的所有3个用户都被返回了。
capture

非常感谢您的帮助

我终于做到了:) ty

我也突然无法搜索关系,我使用$ this-> model-> with('relation')-> select('*');
mtx-z您可以分享解决方案吗?

嘿。 我使用的代码是我特有的。
this-> model包含我的模型的实例。

可以提供您的代码吗?

\\ 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模型,声明保护$ table ='ms_customers',也有MsCustomer模型内部的'company'关系。 然后,MsCompany使用表名称“ ms_companies”进行建模。

我可以搜索ID,代码,名称和电子邮件,但不能搜索“ 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我有同样的问题,我无法对对象值和关系值(仅id)使用全局搜索。
例如,我所有的模型都有一个关联的“ translation_model”。 只能包含公共文本。 好吧,我的数据表无法自动搜索翻译的名称。

为了解决这个问题,我编辑了ajax调用以添加一些参数(文本搜索,选择值...),然后使用此值过滤雄辩的查询,然后再将其发送到Datatable。
在这里,您可以过滤任何内容(在实际情况下,这是一个“ where”和“ whereas translation”,其中“ translations.name ='search_value'”很有说服力。

@nsetyo您检查返回的收藏

@ mtx-z是的。 我暂时使用连接查询来解决此问题

@nsetyo @ mtx-z所有者已经确认搜索关系仍然存在错误。 检查一下https://github.com/yajra/laravel-datatables/issues/698

我正在尝试帮助修复它,并且仍在学习包内过滤方法中的代码,但仍然混淆应在何处修复😆

我所有的搜索字段现在都在运行,但我还有1个问题。 根据yajra (所有者)给出的演示,表中有Created AtUpdated At字段。 我的表中还有一个显示日期和时间的字段,但问题是,如果我将显示的日期和时间格式化为对用户来说更易读的格式,则数据表将无法搜索那些新格式化的日期和时间。

示例:(显示默认日期和时间格式)
2016-08-23 14:37:25

我将其格式化为:
2016年8月23日02:37:25 PM

使用date('F d, Y h:i:s a',strtotime($the_given_date_and_time));

格式化后,数据表无法搜索该字段

您可以使用filterColumn api覆盖用于在日期列上进行搜索以匹配显示内容的默认sql。

对于addcolumn,它应该是可搜索的。

此页面是否有帮助?
0 / 5 - 0 等级