我曾经使用filtercolumn()使我可以搜索多个列,如名称(从first_name和last_name组合)
我已经阅读了您的演示,但查询有所不同,所以我仍然感到困惑:(
$(function () {
$("#datatable").DataTable({
processing: true,
serverSide: true,
"order": [[ 1, "asc" ]],
ajax: "{!! route('admin.customers.getdata','Umum') !!}",
columns: [
{ data: null, bSortable: false, className: "text-center" },
{ data: "id" },
{ data: "name", name: "name" },
{ data: "type" },
{ data: "email" },
{ data: "location" },
{ data: "active", bSortable: false, className: "text-center" },
{ data: "free_ongkir", bSortable: false, className: "text-center" },
{ data: "action", bSortable: false, className: "text-center" }
],
fnRowCallback: function(nRow, aData, iDisplayIndex){
$("td:first", nRow).html(iDisplayIndex +1);
return nRow;
}
});
这是我控制器中的代码
public function getdata($type)
{
$users = User::where(['type'=>$type])->whereHas('roles', function ($query) {
$query->where('slug', '=', 'user');
})->get();
foreach ($users as $key => $value) {
if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
else$value->disabled = "";
}
return Datatables::of($users)
->editColumn('name', '
<a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
')
->filterColumn('name', function($query, $keyword) {
$sql = "CONCAT(users.first_name,'-',users.last_name) like ?";
$query->whereRaw($sql, ["%{$keyword}%"]);
})
->editColumn('type', function($users) {
if($users->hasAccess('superadmin')) return 'Super Admin';
else return "Komoditi $users->type";
})
->editColumn('active', function($users) {
if(!$users->is_approved) {
return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum di approve</label></span>';
} else if(Activation::completed($users)) {
return '<span class="has-success form-group"><label><i class="fa fa-check"></i> Aktif</label></span>';
} else {
return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum Aktivasi</label></span>';
}
})
->editColumn('free_ongkir', function($users) {
if ($users->free_ongkir == 1) {
return '<span class="has-success form-group"><label><i class="fa fa-check"></i></label></span>';
}else {
return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i></label></span>';
}
})
->editColumn('location', function($users){
if(empty($users->city->name)) return 'None';
else return $users->city->name;
})
->addColumn('action', '@if(Sentinel::getUser()->hasAccess(["customers.edit"]))<button class="btn btn-primary" type="button" onClick="location.href=\'{{ route(\'admin.customers.edit\', $id) }}\'"><i class="fa fa-edit"></i></button>
<strong i="13">@endif</strong>
{!! Form::open([
\'method\'=>\'DELETE\',
\'route\' => [\'admin.customers.destroy\', $id],
\'style\' => \'display:inline\'
]) !!}
@if(Sentinel::getUser()->hasAccess(["customers.destroy"]))
{!! Form::button(\'<i class="fa fa-trash"></i>\', [\'class\' => \'btn btn-danger btn-md\',\'type\'=>\'submit\',\'onclick\'=>\'return confirm("Are you sure want to delete?")\', $disabled]) !!}
<strong i="14">@endif</strong>
{!! Form::close() !!}
')
->make(true);
}
@faisalhilmi请参阅https://github.com/yajra/laravel-datatables/issues/1173提供的解决方案
我看到参考,然后尝试像这样修改:
{ data: "name", name: "name" },
{ data: "first_name", name: "first_name", visible: false },
{ data: "last_name", name: "last_name", visible: false },
在控制器中:
->editColumn('name', '
<a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
')
->filterColumn('name', function($query, $keyword) {
$query->orWhere('first_name', 'like', '%'. $keyword . '%');
$query->orWhere('last_name', 'like', '%'. $keyword . '%');
})
但搜索只能使用名字或姓氏,不能同时使用两者。
可能吗?
嗯,我认为这里存在与多个字词搜索功能有关的错误。 您是否在搜索全名空格,对吗? 我认为传递给filterColumn的关键字现在分为两部分(名字和姓氏)。
您可以尝试:
->filterColumn('name', function($query, $keyword) {
$sql = "CONCAT(users.first_name,'-',users.last_name) like ?";
$keyword = request('search.value');
$query->whereRaw($sql, ["%{$keyword}%"]);
})
是的,我想搜索全名:)
我尝试这样
$users = User::where(['type'=>$type])->whereHas('roles', function ($query) {
$query->where('slug', '=', 'user');
})->get();
foreach ($users as $key => $value) {
if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
else$value->disabled = "";
}
return Datatables::of($users)
->editColumn('name', '
<a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
')
->filterColumn('name', function($query, $keyword) {
$sql = "CONCAT(users.first_name,'-',users.last_name) like ?";
$keyword = request('search.value');
$query->whereRaw($sql, ["%{$keyword}%"]);
})
但仍然无法正常工作,即使我尝试将filtercolumn上的$ query更改为$ users :(
$ users查询有问题吗?
您的ajax响应是否返回任何错误?
没有错误,当我搜索“客户umum”时只是“未找到匹配的记录”
“客户”是用户表上的first_name
“ umum”是用户表上的last_name
您可以尝试检查ajax请求并粘贴生成的sql吗? 我怀疑您的sql出了点问题。 尝试手动运行它。
哎呀,您刚刚意识到您正在使用v6.x,因此不适用于多词搜索。 对不起!
“ yajra / laravel-datatables-oracle”:“〜6.0”,多数民众赞成在问题所在?
不,这不是问题,我只是引用了错误的功能。 我认为这里的错误是在您生成的SQL上。
您可以在名字和姓氏上使用concat,但要使用-
来分隔空格而不是空格。 也许是造成问题的原因?
没有它仍然找不到全名:(
您需要调试生成的查询。 使用chrome开发工具或firebug并检查生成的SQL。
我必须在其中添加concat吗?
$users = User::where(['type'=>$type])->whereHas('roles', function ($query) {
$query->where('slug', '=', 'user');
})->get();
哦,您需要删除->get();
并让程序包在sql级别上进行分页。
我不能,因为它同级到另一个进程:(
如果您使用->get()
,那么您现在正在使用collection而不是雄辩的。 而且我认为filterColumn不适用于Collection
。 您需要找到一种删除查询上的get的方法。 这就是为什么搜索失败的问题。
终于解决了,我修改了控制器和数据表中的查询,如下所示:
$("#datatable").DataTable({
processing: true,
serverSide: true,
"order": [[ 1, "asc" ]],
ajax: "{!! route('admin.customers.getdata','Umum') !!}",
columns: [
{ data: null, bSortable: false, className: "text-center" },
{ data: "id" },
{ data: "name", name: "full_name" },
{ data: "type" },
{ data: "email" },
{ data: "location" },
{ data: "active", bSortable: false, className: "text-center" },
{ data: "free_ongkir", bSortable: false, className: "text-center" },
{ data: "action", bSortable: false, className: "text-center" }
],
fnRowCallback: function(nRow, aData, iDisplayIndex){
$("td:first", nRow).html(iDisplayIndex +1);
return nRow;
}
});
控制器:
{
$users = User::select('id','email','first_name','last_name','city_id', 'is_approved','type', DB::raw("CONCAT(first_name,' ',last_name) as full_name"))->where(['type'=>$type])->whereHas('roles', function ($query) {
$query->where('slug', '=', 'user');
})->get();
foreach ($users as $key => $value) {
if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
else$value->disabled = "";
}
return Datatables::of($users)
->editColumn('name', '
<a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
')
->editColumn('type', function($users) {
if($users->hasAccess('superadmin')) return 'Super Admin';
else return "Komoditi $users->type";
})
->editColumn('active', function($users) {
if(!$users->is_approved) {
return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum di approve</label></span>';
} else if(Activation::completed($users)) {
return '<span class="has-success form-group"><label><i class="fa fa-check"></i> Aktif</label></span>';
} else {
return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum Aktivasi</label></span>';
}
})
->editColumn('free_ongkir', function($users) {
if ($users->free_ongkir == 1) {
return '<span class="has-success form-group"><label><i class="fa fa-check"></i></label></span>';
}else {
return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i></label></span>';
}
})
->editColumn('location', function($users){
if(empty($users->city->name)) return 'None';
else return $users->city->name;
})
->addColumn('action', '@if(Sentinel::getUser()->hasAccess(["customers.edit"]))<button class="btn btn-primary" type="button" onClick="location.href=\'{{ route(\'admin.customers.edit\', $id) }}\'"><i class="fa fa-edit"></i></button>
<strong i="9">@endif</strong>
{!! Form::open([
\'method\'=>\'DELETE\',
\'route\' => [\'admin.customers.destroy\', $id],
\'style\' => \'display:inline\'
]) !!}
@if(Sentinel::getUser()->hasAccess(["customers.destroy"]))
{!! Form::button(\'<i class="fa fa-trash"></i>\', [\'class\' => \'btn btn-danger btn-md\',\'type\'=>\'submit\',\'onclick\'=>\'return confirm("Are you sure want to delete?")\', $disabled]) !!}
<strong i="10">@endif</strong>
{!! Form::close() !!}
')
->make(true);
}
谢谢 :)
最有用的评论
终于解决了,我修改了控制器和数据表中的查询,如下所示:
控制器:
谢谢 :)