まず、この素晴らしいパッケージの素晴らしい仕事です。
私は小さな問題があります:
デモファイルに新しいカスタム列を追加しました:... / eloquent / add-edit-remove-column、その列を検索/フィルタリングしたいのですが、すべてを入力するとブラウザでエラーが発生します。
カスタム列で検索/フィルタリングし、その後、custom_columnを含むテーブルのすべての列に検索入力テキストを追加するソリューションはありますか?
FireBugコンソールのエラー:
<span class="exception_message">SQLSTATE[42S22]: Column not found: 1054 Champ
'new_column' inconnu dans where clause (SQL: select count(*) as aggregate from (select '
;1' as row_count from `users` where (LOWER(`id`) LIKE %b% or LOWER(`name`) LIKE %b% or LOWER(`email
`) LIKE %b% or LOWER(`created_at`) LIKE %b% or LOWER(`updated_at`) LIKE %b% or LOWER(`new_column`) LIKE
%b%)) count_row_table)</span>
コントローラーからのコード:
public function getAddEditRemoveColumnData()
{
$users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']);
return Datatables::of($users)
->addColumn('new_column' , 'ABC')
->make(true)
}
Javascriptからのコード:
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: '{{ url("eloquent/add-edit-remove-column-data") }}',
columns: [
{data: 'id', name: 'id'},
{data: 'name', name: 'name'},
{data: 'email', name: 'email'},
{data: 'created_at', name: 'created_at'},
{data: 'updated_at', name: 'updated_at'},
{data: 'new_column', custom: 'new_column', orderable: true, searchable: true}
]
});
@marioene 、データがデータベースからのものでない場合、 addColumn
検索することはできません。 この回避策は、以下のようにselectステートメントに列を追加することです。 addColumn
を使用する必要はありません。
$users = User::select([
'id', 'name', 'email', 'password', 'created_at', 'updated_at',
DB::raw("'ABC' as new_column")
]);
注:機能させるには、カスタム
filterColumn
を作成する必要がある場合があります。 生成されたSQLが機能していることを確認してください。また、パッケージでも機能するはずです。
非アクティブによる終了と上記の推奨される回避策により、問題が修正されるはずです。 ありがとう!
@yajra私はあなたの提案に従って、最初に「select」(コントローラー内)を使用して計算列を追加しました
$staffData = Staff::select('id', 'staff_id', \DB::raw('concat(first_name, " ", middle_name, " ", last_name) as full_name'), 'department_name', 'status');
次に、カスタムフィルターを(コントローラーに)追加しました
$dt = Datatables::of($staffData);
return $dt->filterColumn('full_name', function($query, $keyword) {
$query->whereRaw("CONCAT(first_name, ' ', middle_name, ' ', last_name) like ?", ["%{$keyword}%"]);
})->make(true);
最初にページを読み込んだとき、グローバル検索入力テキストボックスを使用して検索すると、データテーブルが正しくレンダリングされ、エラーがスローされます。
Ajax error. http://datatables.net/tn/7
どこを間違えているのか教えてください。
@ AshishGupta001 chrome開発ツールまたは調べてみてください。 問題の原因についてのヒントが得られます。 おそらく、SQL例外の問題です。
@yajara迅速な対応ありがとうございます。
「計算された」列(私の場合は「full_name」)のグローバル検索を実装しているときに、
1)問題168:https://github.com/yajra/laravel-datatables/issues/168
2)例: https :
データテーブルにカスタムの「filterColumn()」を追加する前に、テーブルに列「full_name」がないことを訴えるSQL例外が発生していました。 次に、以下のコードを追加して、「計算された」列(私の場合は「full_name」)のカスタムフィルターを以下のように追加しました
$dt->filterColumn('full_name', function($query, $keyword) {
$query->whereRaw("CONCAT(staff.first_name, ' ', staff.middle_name, ' ', staff.last_name) like ?", ["%{$keyword}%"]);
});
return $dt->make(true);
ログに次のエラーが表示されます
mb_strtolower() expects parameter 1 to be string, object given
ファイル内の......./vendor/laravel/framework/src/Illuminate/Support/Str.php#162
この問題のデバッグにご協力いただければ幸いです。
@ AshishGupta001どのバージョンを使用していますか? あなたのコードは私には問題ないように見えます。
@yajra確認していただきありがとうございます。 バージョンは以下の通りです
PHP -5.5.38-3
Laravel -5.0.34
Datatables -yajra / laravel-datatables-oracle:^ 6.3(composer.jsonのように)
Helperクラスの「getOrMethod」にあるようですが、入力パラメータとして渡された「クローザー」を下げるように変換しようとしているため、例外がスローされています。
public static function getOrMethod($method) {
if (! Str::contains(Str::lower($method), 'or')) {
return 'or' . ucfirst($method);
}
return $method;
}
'$ method'は、以下のように、 function($query, $keyword)
を渡されたクローザーです。
Closure {#864
reflection: """
Closure [ <user> public method App\Http\Controllers\{closure} ] {\n
@@ /var/www/html/XYZ/app/Http/Controllers/StaffHistoryController.php 310 - 313\n
\n
- Parameters [2] {\n
Parameter #0 [ <required> $query ]\n
Parameter #1 [ <required> $keyword ]\n
}\n
}\n
"""
}
直面した問題を理解することはできませんでしたが、この特定のユースケースを回避する方法を見つけることができました。 ここで利用可能なヒントをありがとう。
ビュー:スクリプトタグ内のビューに次のものがあります
{ data: 'full_name', name: 'full_name', searchable: false },
{ data: 'first_name', name: 'first_name', searchable: true, visible: false },
{ data: 'middle_name', name: 'middle_name', searchable: true, visible: false },
{ data: 'last_name', name: 'last_name', searchable: true, visible: false }
コントローラ: SQLクエリのfirst_nameなどを残りの列値とともにフェッチします。
@ AshishGupta001あなたがそれを理解してくれてうれしいです。 これは、Laravel4.2バージョン以降も私が行っていたことです。 👍
@ AshishGupta001良い解決策!
@yajraデータベースからのデータであるaddColumnを使用して追加された列を検索できますが、JSにこの列を追加していませんか?
または、それをJSに追加して、非表示にするが検索可能にする必要がありますか?
私が考えることができるいくつかの方法:
{data: 'added_column', name: 'actual_column_name'}
迅速な対応ありがとうございます@yajra
私はすでに2番目の解決策を試していましたが、この追加された列がクエリで考慮されていないことに気付きました。
何かご意見は ?
その列にsearchable: false
を追加していないことを確認してください。
これが私が列->addColumn('company_name', function($deal) {
return $deal->company_name;
})
を追加した方法です
そして、グローバル検索クエリは$dataTable->filterColumn('company_name', 'where', "like", ["%$keyword%"]);
バックエンドでsearchable: false
を渡すことはできますか?
searchable: false
はクライアント側のjsにあります。
ところで、どのバージョンを使用していますか?
ああ、わかりました。 したがって、最初に述べた方法をこの方法で使用する必要があります。
v6.17.0
@ AshishGupta001と同じ問題が発生していますが、残念ながら、列が並べ替えられないため、クライアント側のトリックでは問題が解決されません。
filterColumnの代替案を検討しましたが、それも機能させることができませんでした。
「yajra / laravel-datatables-oracle」を使用:「〜9.0」
コントローラ方式:
public function getAccounts(Request $request)
{
if ($request->ajax()) {
$accounts = Account::with('current_marketer')->select([
'*',
DB::raw("CONCAT(accounts.lastname,' ',accounts.firstname) as fullname"),
]);
return Datatables::of(Account::query()->with('current_marketer'))
->addColumn('marketer', function(Account $account){
return $account->current_marketer->name;
})
->addColumn('fullname', function($account){
return '<a href="'.route('account.clients.show', $account->account_number).'" class="hover:underline" target="_blank">'. $account->fullname.'</a>';
})
->filterColumn('fullname', function($query, $keyword) {
$sql = "CONCAT(accounts.lastname,' ',accounts.firstname) like ?";
$$query->whereRaw($sql, ["%{$keyword}%"]);
})
->rawColumns(['fullname'])
->editColumn('created_on', function(Account $account) {
return Carbon::parse($account->created_on)->format('jS F, Y');
})
->toJson();
}
return view('datatables.accounts.index');
}
ブレードjs:
$('#accounts-table').DataTable({
"processing": true,
"serverSide": true,
"ajax": '{{ route('accounts.get') }}',
"columns": [
{ data: "id" },
{ data: "account_number" },
{ data: 'fullname'},
{ data: "marketer" },
{ data: "created_on" },
]
});
例外:検索または並べ替えが試行された場合:
その例外の問題は私のせいでした。 filterColumnメソッド内に二重の「$$」記号がありました。
しかし、それは私のソートの問題を解決しませんでした。 私はまだ知る必要があります:
@ seewhy17複雑な並べ替えには、 orderColumnを使用できます。 ただし、あなたの場合、 fullname
での注文は、箱から出してすぐに機能します。
@ seewhy17複雑な並べ替えには、 orderColumnを使用できます。 ただし、あなたの場合、
fullname
での注文は、箱から出してすぐに機能します。
そうではありませんでした。filterColumnメソッドは、基本的に同じことを行うモデルのアセッサーと競合していると思います...私は本当に知りません。
知っているので、jsにname: lastname
を追加することで、ある種の作業を行うことができたので、姓でフィルタリングし、filterColumnメソッドは冗長です
最も参考になるコメント
@marioene 、データがデータベースからのものでない場合、
addColumn
検索することはできません。 この回避策は、以下のようにselectステートメントに列を追加することです。addColumn
を使用する必要はありません。