yajra/laravel-datatables 搜索不适用于 laravel 5.4

Posted

技术标签:

【中文标题】yajra/laravel-datatables 搜索不适用于 laravel 5.4【英文标题】:yajra/laravel-datatables search is not working with laravel 5.4 【发布时间】:2018-03-23 05:11:13 【问题描述】:

我使用 yajra/laravel-datatables 来创建数据网格列表。我已根据要求使用连接来检索信息。

这是加入代码

$inquiryInvoice = DB::table('inquiry_invoice')->select('inquiry_invoice.*',DB::raw('CONCAT(inquiry_personal.first_name, " ", inquiry_personal.middle_name, " ", inquiry_personal.last_name) AS full_name'), 'inquiry_personal.id as inquiry_personal_id','branches.branch_name',DB::raw('CONCAT(users.first_name, " ", users.last_name) AS user_full_name'), DB::raw('CONCAT(counselor.first_name, " ", counselor.last_name) AS counselor_full_name'), 'inquiry_counselor.user_id as inquiry_counselor_user_id','inquiry_master.workflow_id',DB::raw(' "invoice" AS type'))
                ->join('inquiry_master', 'inquiry_master.id', '=', 'inquiry_invoice.inquiry_id')
                ->join('inquiry_personal', 'inquiry_master.id', '=', 'inquiry_personal.inquiry_id')
                ->join('branches', 'inquiry_master.branch_id', '=', 'branches.id')
                ->join('users', 'inquiry_master.user_id', '=', 'users.id')
                ->leftJoin('inquiry_counselor', 'inquiry_master.id', '=', 'inquiry_counselor.inquiry_id')
                ->leftJoin('users as counselor', 'inquiry_counselor.user_id', '=', 'counselor.id');

这是分配Datatables的代码

return Datatables::of($inquiryInvoice)
            ->escapeColumns([])
            ->make(true);

这里是 jQuery 代码

$dataTable = $('#data-table').DataTable(
            processing: true,
            serverSide: true,
            Filter: true,
            url:'!! url("transaction_any_data") !!',
            columns: [
                 data: 'full_name', name: 'full_name' ,
                 data: 'branch_name', name: 'branch_name' ,
                 data: 'user_full_name', name: 'user_full_name' ,
                 data: 'counselor_full_name', name: 'counselor_full_name' 
            ]
        );

现在,当我尝试搜索某些内容时,它会给我 alerterror 这是一条错误消息,

现在我想知道,

如何使用JOINCONCAT 列快速搜索?

有具体的方法吗?

请给我最好的方法...

【问题讨论】:

这与 DataTables 无关。您的 SQL 查询中存在错误,就像错误消息中所说的那样。 @Jerodev,这不是 SQL 错误,因为当我在 mysql 中运行查询时,它运行良好并返回结果。问题是 DataTables 在数据库表的列中搜索,而不是在连接列中 【参考方案1】:

对于 Laravel DataTables,当您使用两个或多个名称不明确的表时,您需要在 columns.name 选项中包含表名。

由于full_name 是不明确的名称,您需要将其更改为inquiry_invoice.full_name

例如:

$dataTable = $('#data-table').DataTable(
   processing: true,
   serverSide: true,
   url:'!! url("transaction_any_data") !!',
   columns: [
       data: 'full_name', name: 'inquiry_invoice.full_name' ,
       data: 'branch_name', name: 'branch_name' ,
       data: 'user_full_name', name: 'user_full_name' ,
       data: 'counselor_full_name', name: 'counselor_full_name' 
   ]
);

另一个问题是您需要使用HAVING 而不是WHERE 来搜索使用CONCAT 生成的列。您需要使用filterColumn() 方法为最后三列生成自定义搜索子句。

例如(未经测试):

return Datatables::of($inquiryInvoice)
        ->escapeColumns([])
        ->filterColumn('branch_name', function($query, $keyword) 
            $query->havingRaw('LOWER(branch_name) LIKE ?', ["%$keyword%"]);
        )
        ->filterColumn('user_full_name', function($query, $keyword) 
            $query->havingRaw('LOWER(user_full_name) LIKE ?', ["%$keyword%"]);
        )
        ->filterColumn('counselor_full_name', function($query, $keyword) 
            $query->havingRaw('LOWER(counselor_full_name) LIKE ?', ["%$keyword%"]);
        )
        ->make(true);

【讨论】:

【参考方案2】:

它根本不适用于 POST。尝试使用 GET 作为 Http 方法。 (至少对于 Laravel 5.5 和 5.6)

【讨论】:

【参考方案3】:

您应该使用 php 7.0 或更高版本更新您的 PHP 版本,然后它会正常工作。

【讨论】:

我的 PHP 版本 7.1.9 和 mysql 版本 5.7.19

以上是关于yajra/laravel-datatables 搜索不适用于 laravel 5.4的主要内容,如果未能解决你的问题,请参考以下文章

yajra / laravel-datatables搜索不适用于laravel 5.4

如何将数据库索引与 Datatables 和 yajra/laravel-datatables 一起使用

不存在关系时的默认值

Laravel 查询生成器联合:添加“表名”列

根据子表中的“当前”值过滤 belongsToMany 记录

带有服务器端的 Laravel 5 数据表