Laravel-datatables: addColumnによって生成された列を検索する方法は?

作成日 2015年08月03日  ·  22コメント  ·  ソース: yajra/laravel-datatables

まず、この素晴らしいパッケージの素晴らしい仕事です。

私は小さな問題があります:

デモファイルに新しいカスタム列を追加しました:... / eloquent / add-edit-remove-column、その列を検索/フィルタリングしたいのですが、すべてを入力するとブラウザでエラーが発生します。

カスタム列で検索/フィルタリングし、その後、custom_columnを含むテーブルのすべての列に検索入力テキストを追加するソリューションはありますか?

FireBugコンソールのエラー:

  <span class="exception_message">SQLSTATE[42S22]: Column not found: 1054 Champ
 &#039;new_column&#039; inconnu dans where clause (SQL: select count(*) as aggregate from (select &#039
;1&#039; 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が機能していることを確認してください。また、パッケージでも機能するはずです。

全てのコメント22件

@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に追加して、非表示にするが検索可能にする必要がありますか?

私が考えることができるいくつかの方法:

  1. それをjsに追加して、あなたが言ったようにそれを非表示にして検索可能にします。
  2. filterColumnを使用して、追加された列の検索を手動で処理します。
  3. このように宣言します。
{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" },
          ]
        });

例外:検索または並べ替えが試行された場合:

yajraIssue

その例外の問題は私のせいでした。 filterColumnメソッド内に二重の「$$」記号がありました。
yajra_issue_fix_1

しかし、それは私のソートの問題を解決しませんでした。 私はまだ知る必要があります:

  1. 列を並べ替え可能にする方法
  2. 関連する列を検索して並べ替える方法ドキュメントをもう一度見ると、私のユースケースではこれがクリアされました

@ seewhy17複雑な並べ替えには、 orderColumnを使用できます。 ただし、あなたの場合、 fullnameでの注文は、箱から出してすぐに機能します。

@ seewhy17複雑な並べ替えには、 orderColumnを使用できます。 ただし、あなたの場合、 fullnameでの注文は、箱から出してすぐに機能します。

そうではありませんでした。filterColumnメソッドは、基本的に同じことを行うモデルのアセッサーと競合していると思います...私は本当に知りません。
知っているので、jsにname: lastnameを追加することで、ある種の作業を行うことができたので、姓でフィルタリングし、filterColumnメソッドは冗長です

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

sangnguyenplus picture sangnguyenplus  ·  3コメント

kamrava picture kamrava  ·  3コメント

shadoWalker89 picture shadoWalker89  ·  3コメント

hohuuhau picture hohuuhau  ·  3コメント

alejandri picture alejandri  ·  3コメント