Laravel-datatables: yajraDatatablesクイック検索機能が検索されない

作成日 2016年06月07日  ·  17コメント  ·  ソース: yajra/laravel-datatables

良い一日!

データテーブル内のレコードの検索に問題があります。 検索できるのはtracking_id列のみです。 すべての列を検索する必要があります。

これが私のクエリphpコードです:

$result = Document::join('user','document.user_id','=','user.id')
->join('classification','document.classification_id','=','classification.id')
->select('document.id',DB::raw('CONCAT(document.tracking_type,"-",document.tracking_date,"-",document.tracking_seq_no) AS tracking_id'),'document.date_prepared','document.subject','classification.description as doc_class')
->orderBy('document.created_at','desc')->get();

return Datatables::collection($result)
->addColumn('check',function($record){
    return '<input type="checkbox" name="check['.$record->id.']" class="checkboxes" value='.$record->id.'>';})
->addColumn('action',function($record){
    return '<a href="/records/view/' . $record->tracking_id . '">View Record</a></a>';})
->addColumn('document.tracking_id',function($record){
    return $record->tracking_id;})
->editColumn('document.doc_class',function($record){
    return $record->doc_class;})
->addColumn('document.subject',function($record){
    return $record->subject;})
->addColumn('document.date_prepared',function($record){
    return date('F d, Y', strtotime($record->date_prepared));})
->make(true);

JS宣言:

docstable = $('.docstable').DataTable({
    processing: true,
    serverSide: true,
    ajax: "/ajax/docrec"
    columnDefs: [
        {targets:[0,1], orderable:false}
    ],
    columns: [
        {data:'check'},
        {data:'action'},
        {data:'tracking_id',name:'document.tracking_id'},
        {data:'doc_class',name:'document.doc_class'},
        {data:'subject',name:'document.subject'},
        {data:'date_prepared',name:'document.date_prepared'}
    ]
});

PHPコードでsearchColumns()を使用して、指定されたすべての列を検索できるBllim Datatablesのような方法はありますか? ありがとうございました

question

最も参考になるコメント

こんにちは@ChaosPowerそしてあなたの答えに感謝します。

私はあなたの解決策を試しましたが、うまくいきませんでした。 実際、 $this->mainRepo->modelは、App \ Modelsのモデルインスタンスです。 mainRepoのものにバインドされていますが、私の問題とは関係ありません。
私はこのようなものを持つように更新しました(私のリポジトリから):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

このメソッドを使用して、モデルのすべてのDataTablesデータを管理します。 dataTable変数がfalseの場合、順序付けは適用されず、 select('*')ます。

結局、連鎖メソッドは次のようになります。
$this->model->with('relation')->select('*');ここで、 $this->modelApp\Models\Userです。

これで列の順序は完全に機能しますが、デフォルトのテキスト検索は検索に影響を与えません。 入力に関係なく、すべての結果が表示されます。
私はまた何か間違ったことをしましたか?

ここに私の検索入力が表示されますが、「my search value」入力が何も返さない場合でも、3人のユーザーすべてが返されます。
capture

あなたの助けのためにたくさん感謝します

全てのコメント17件

デフォルトでは、すべての列でのクイック検索がサポートされていますが、結合クエリを使用しているため、このデモのように、スクリプトで名前を宣言する方法にいくつかの変更があります。

ところで、なぜ雄弁ではなくコレクションを使用しているのですか? クエリでget()を削除し、代わりにreturn Datatables::eloquent($result)を使用することをお勧めしますか?

こんにちは !
私にとって、グローバル検索は常に空の結果を返します。 検索後、データテーブルが空になりました。 すべての検索入力を削除すると、すべてのデータでいっぱいになります。
しかし、私はそれを次のように簡単にします:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

HTTPリクエストで検索入力を確認できますが、行の結果は常に空です。 グローバル検索オプションを許可するには、サーバー側で何かを行う必要がありますか? 自動だと思った...
capture

データは私のリポジトリから送られてきます。基本的には、順序付けや並べ替えを行わずに$ model-> get()を実行します。 グローバルテキストと列テキストのフィルタリングを行うだけで十分だと思いました。 しかし、Eloquentリクエストで「where」を使用するソリューションを実装する必要がありますか? それとも、DataTablesフィルターメソッドを使用してフィルターする方が良いですか? (何も自動ではない場合、私はすべてのサーバー側を行う必要があります)。

しかし、この例、この1任意のサーバー側の処理を実装し、偶数列の検索ごとに、グローバル検索を得ることはありませんが...私は成功せず、全てのこれらの例を試してみました:検索結果が常に空で、データテーブルには、最初の検索文字で空であります送信し、フィルターがまったく入力されていない場合は、すべてのデータを埋め戻します。

基本的な質問は次のとおりです。モデルデータからのサーバー側のフィルタリング/検索用にパッケージに実装されているものはありますか、それとも列の並べ替えとページ付けのみが利用可能ですか?

あなたの読書とあなたの助けに感謝します!

PS:私の#562コメントにリンク

@ mtx-z-> get()を呼び出すと、LDTのオブジェクトの代わりにコレクションを使用します。

$users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']); //Eloquent Object

$users->all(); // Collection

LaravelDatatablesは自動的に-> get()を実行しますが、-> get()を使用しないことをお勧めします。

return Datatables::of($users)->make(true);

あなたの例に基づいて、あなたは必要ありません-> get()


$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

ただ


$users = $this->mainRepo->model; return Datatables::of($users)->make(true);

フィルタリングと検索に関する主な質問。 Laravel Datatablesは、デフォルトですべての列への検索をすでに実装しています/サーバー側の処理。 また、個々の列のフィルタリングもサポートしています。

https://datatables.yajrabox.com/eloquent/basic-送信されたヘッダーを参照してください
https://datatables.yajrabox.com/eloquent/multi-filter-select-送信されたヘッダーを参照してください

こんにちは@ChaosPowerそしてあなたの答えに感謝します。

私はあなたの解決策を試しましたが、うまくいきませんでした。 実際、 $this->mainRepo->modelは、App \ Modelsのモデルインスタンスです。 mainRepoのものにバインドされていますが、私の問題とは関係ありません。
私はこのようなものを持つように更新しました(私のリポジトリから):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

このメソッドを使用して、モデルのすべてのDataTablesデータを管理します。 dataTable変数がfalseの場合、順序付けは適用されず、 select('*')ます。

結局、連鎖メソッドは次のようになります。
$this->model->with('relation')->select('*');ここで、 $this->modelApp\Models\Userです。

これで列の順序は完全に機能しますが、デフォルトのテキスト検索は検索に影響を与えません。 入力に関係なく、すべての結果が表示されます。
私はまた何か間違ったことをしましたか?

ここに私の検索入力が表示されますが、「my search value」入力が何も返さない場合でも、3人のユーザーすべてが返されます。
capture

あなたの助けのためにたくさん感謝します

私はついにそれをしました:)ty

また、突然リレーションを検索できなくなりました。$ this-> model-> with( 'relation')-> select( '*');を使用しました。
mtx-zソリューションを共有できますか?

ねえ。 私が使用したコードは私に固有のものでした。
this-> modelには、私のモデルのインスタンスが含まれています。

コードを提供できますか?

\\ In controller
$result = MsCustomer::with('company')->select('ms_customers.*');
return Datatables::of($result)->make(true);

\\ In view
$('#data-table').DataTable({
    ajax: '{!! route('master.customer.data') !!}',
    columns: [
        { data: 'id', name: 'id' },
        { data: 'code', name: 'code' },
        { data: 'name', name: 'name' },
        { data: 'email', name: 'email' },
        { data: 'company.name', name: 'company.name' },
   ]
});

データテーブルの実行と表示には、リレーションcompany.nameが含まれますが、リレーションを検索することはできません。 私は推測します、コードはすでにこのデモのように似ています

宣言された保護された$ table = 'ms_customers'を持つモデルMsCustomerがあり、MsCustomerモデル内にリレーション 'company'もあります。 次に、テーブル名が「ms_companies」のMsCompanyモデル。

ID、コード、名前、メールアドレスは検索できますが、リレーション「company.name」は検索できません。 上記のコードに何か問題がありますか?

@maengkomでも同じ問題が発生し、テーブルが

コントローラー内

$agenda = AgendaMasuk::with('surat')
            ->whereNotNull('surat_id')->where('group_id', $group->id)
            ->select('agenda_masuks.*');
        return Datatables::of($agenda)->make(true);

ビューで

var table = $('#surats').DataTable({
        "jQueryUI"   : true,
        "paging"     : true,
        "lengthMenu" : [ 5, 10, 25, 50, 75, 100, "All" ],
        "autoWidth"  : false,
        "stateSave"  : false,
        "order"      : [[ 0, 'asc' ]],
        "processing" : true,
        "scrollX"    : true,
        "serverSide" : true,
        "ajax": {
            "url": $('#surats').data('url'),
            "type": "POST"
        },
        "columns": [
            {
                className: 'text-center',
                data: 'no_agenda',
                name: 'agenda_masuks.no_agenda'
            },
            {
                className: 'text-center',
                data: 'surat.no_surat',
                name: 'surat.no_surat'
            },
            {
                className: 'text-center',
                data: 'tanggal',
                name: 'agenda_masuks.tanggal'
            },
            {
                data: 'surat.sifat',
                name: 'surat.sifat',
                sortable: false
            },
            {
                data: 'surat.pengirim',
                name: 'surat.pengirim'
            },
            {
                data: 'surat.tujuan',
                name: 'surat.tujuan'
            },
            {
                data: 'surat.ringkasan',
                name: 'surat.ringkasan',
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'disposisi',
                searchable: false,
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'file',
                searchable: false,
                sortable: false
            }
        ]
    });

@maengkom同じ問題があり、オブジェクト値とリレーション値(IDのみ)でグローバル検索を使用できませんでした。
たとえば、私のモデルにはすべて「translation_model」が関連付けられています。 Wichには公開テキストとそれだけが含まれています。 ええと、私のデータテーブルは翻訳の名前を自動的に検索することができません。

これを修正するために、ajax呼び出しを編集してパラメーター(テキスト検索、値の選択...)を追加し、この値を使用して雄弁なクエリをフィルタリングしてからDatatableに送信しました。
ここから、何でもフィルタリングできます(実際の場合は、「where」と「wheres translation」、「translations.name = 'search_value'」は雄弁です。

@nsetyo返されたコレクションを確認しましたか? コレクション内のデータは、datatableが必要とするものと一致していますか?

@ mtx-zはい。 代わりに結合クエリを使用してこれを一時的に修正します

@nsetyo @ mtx-z所有者は、検索関係にまだバグがあることをすでに確認しています。 これをチェックしてくださいhttps://github.com/yajra/laravel-datatables/issues/698

私はそれを修正するための助けを試みていますが、パッケージ内のフィルタリングメソッドのコードをまだ学習していますが、どこを修正する必要があるのか​​混乱しています😆

すべての検索フィールドが機能していますが、問題が1つ残っています。 与えられたに基づいてデモyajraによって(所有者)、で、そこで更新。 テーブルに日付と時刻を表示するフィールドもありますが、表示された日付と時刻をユーザーが読みやすいようにフォーマットした場合、データテーブルはそれらの新しくフォーマットされた日付と時刻を検索できませんでした。

例:(デフォルトの日付と時刻の形式が表示されます)
2016-08-23 14:37:25

私はそれを次のようにフォーマットしました:
2016年8月23日02:37:25 PM

date('F d, Y h:i:s a',strtotime($the_given_date_and_time));

フォーマット後、データテーブルはそのフィールドを検索できませんでした

filterColumn apiを使用して、表示されたものと一致するように日付列を検索するためのデフォルトのSQLをオーバーライドできます。

addcolumnの場合、検索可能である必要があります。

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