当我想使用laravel yajra数据表编写自定义全局搜索查询时,我遇到了技术难题
参考 https://yajrabox.com/docs/laravel-datatables/master/filter-column
当我通过传递日历日期和searchbox值进行搜索时,我被困在正确的书写方式上
仅主->filter got triggered
->filterColumn skipped through
....不确定为什么...
在sql vanila中,是
where firstname like %search% OR
lastname like %search% OR
fullname like %search% OR
email like %search% OR
sponsorby like %search% OR
createddate like %date%
这是我的代码供参考。未触发filterCustom ...
if ($request->ajax()) {
$users = \DB::select('
SELECT id, usercode as membercode, concat(firstname, " ", lastname) as fullname, email, created_at as createddate, (select concat(firstname, " ", lastname) from users where id= m.parentid) sponsorby
FROM users m
ORDER BY m.created_at ASC');
更新:我意识到yajra不支持带有完整原始sql的DB :: select,但是它支持DB :: table 因此,我将sql更改为以下
$users = \DB::table('users')
->select('id', 'usercode as membercode', \DB::raw('concat(firstname, " ", lastname) as fullname'), 'email', 'created_at as createddate', \DB::raw('(select concat(firstname, " ", lastname) from users as b where b.id= users.parentid) as sponsorby'));
//end
return Datatables::of($users)
->addColumn('membercode', function($row){
$content= $row->membercode;
return $content;
})
->addColumn('fullname', function($row){
$content= $row->fullname;
return $content;
})
->addColumn('email', function($row){
$content= $row->email;
return $content;
})
//etc
->filter(function ($sql) use ($request) {
$search = $request->search;
if (!empty($search))
{
$sql->Where('email', 'LIKE', "%$search%");
}
})
->filterColumn('fullname', function($query, $request) {
$search = $request->search;
$sql = 'concat(firstname, " ", lastname) like ?';
$query->whereRaw($sql, ["%{$search}%"]);
})
->filterColumn('membercode', function($query, $request) {
$search = $request->search;
$sql = 'usercode as membercode like ?';
$query->whereRaw($sql, ["%{$search}%"]);
})
->filterColumn('createddate', function($query, $request) {
$search = $request->date;
$sql = 'created_at as createddate like ?';
$query->whereRaw($sql, ["%{$search}%"]);
})
->filterColumn('sponsorby', function($query, $request) {
$search = $request->search;
$sql = '(select concat(firstname, " ", lastname) from users as b where b.id= users.parentid) like ?';
$query->whereRaw($sql, ["%{$search}%"]);
})
->make(true);
}