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に渡されるキーワードは、2つの部分(名前と名前)に分かれていると思います。
試してみてください:
->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応答でエラーが返されますか?
「customerumum」を検索すると、エラーは発生せず、「一致するレコードが見つかりません」だけです。
「customer」はusersテーブルのfirst_nameです
「umum」はusersテーブルの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()
を使用する場合、雄弁ではなくコレクションを使用するようになりました。 そして、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);
}
ありがとうございました :)
最も参考になるコメント
最終的に解決されたので、コントローラーとデータテーブルのクエリを次のように変更します。
コントローラー:
ありがとうございました :)