【问题标题】:Laravel Yajra Datatables searchable not working on desire column可搜索的 Laravel Yajra 数据表不适用于欲望列
【发布时间】:2020-09-22 04:09:05
【问题描述】:

我有这样的数据表列:

var showMasterUserTable = function () {
        masterIcon = $('#master_user_table').DataTable({
            processing: true,
            serverSide: true,
            responsive: true,
            ajax: {
                url: ROOT + 'master-voucher-bit-x/data',
            },
            columns: [
                {
                    data: 'DT_RowIndex',
                    name: 'DT_RowIndex',
                    searchable: false,
                    orderable: false
                },
                {
                    data: 'voucher_code',
                    name: 'voucher_code',
                },
                {
                    data: 'status',
                    name: 'status',
                },
                {
                    data: 'track',
                    name: 'track',
                },
                {
                    data: 'user_use',
                    name: 'user_use',
                    orderable: true
                },
                {
                    data: 'progress',
                    name: 'progress',
                },
                {
                    data: 'quiz_score',
                    name: 'quiz_score',
                },
                {
                    data: 'urlQr',
                    name: 'urlQr',
                }
            ]
        });
    };

只要我从 yajra 和 datatables 文档中知道 searchableorderable 在未写入时默认为 true,我就遇到了可搜索仅搜索 voucher_code 列的问题如果我将所有searchable 设置为true。我想改为搜索 user_use 列。如果我将所有searchable 设置为false,则无法加载表数据。我应该如何克服它?这是我的控制器代码:

    {
        $model =  VoucherBitX::select('voucher_bit_x.*', 'users.email')
        ->join('users', 'voucher_bit_x.user_id', '=', 'users.id')
        ->orderBy("voucher_bit_x.redeem_at","DESC");

        return DataTables::of($model)
                ->addColumn('status', function ($data) {
                    if($data->status > 0)
                        $status = '<div><span class="badge badge-success"> Available </span></div>';
                        else
                            $status = '<div><span class="badge badge-danger"> Not Available </span></div>';
                    return $status;
                })
                ->addColumn('urlQr', function ($data) {
                    $user = UserApp::find($data->user_id);
                    $a = "";
                    if(!empty($user) && isset($user->ref_id)){
                        $quiz = QuizScore::where("track_id",$data->track_id)->where("user_id",$data->user_id)->first();
                        if($quiz && $quiz->status){
                            $track = Track::find($data->track_id);
                            $urlQr = 'https://xxx.id/api/certificate/'.base64_encode(json_encode(["user_id"=>$user->id,"slug"=>$track->slug,"track_id"=>$track->id]));
                            $a = '<a href="'.$urlQr.'">Download Certificate</a>';
                        }
                    }
                    return $a;
                })
                ->addColumn('quiz_score', function ($data) {
                    $score = 0;
                    $quiz = QuizScore::where("track_id",$data->track_id)->where("user_id",$data->user_id)->first();
                        if($quiz){
                            $score = $quiz->score;
                        }
                    return $score;
                })
                ->addColumn('progress', function ($data) {
                    $progress = 0;
                    $solve = Track::userProgress($data->user_id,$data->track_id);
                        if(!empty($solve)){
                            $progress = $solve;
                        }
                    return $progress."%";
                })
                ->addColumn('user_use', function ($data) {
                    $user = UserApp::find($data->user_id);
                    if(!empty($user))
                        return $user->name." (".$user->email.")";
                    return '-';
                })
                ->addColumn('track', function ($data) {
                    $track = Track::find($data->track_id);
                    return isset($track->title)?$track->title:"";
                })->rawColumns(['quiz_score','status','user_use','track','urlQr'])
                ->addIndexColumn()->make(true);
    }

*编辑: 我已经意识到数据表返回了一个响应,其中包括使用过的查询,如下所示:

新问题:查询json字段配置到底在哪里?在我上面雄辩的查询中,没有 wherelike 查询之类的东西。在 yajra 和 datatables 文档中都没有发现这些东西。我想要的是将 where 字段修改为 users.email 而不是 voucher_bit_x.voucher_code

【问题讨论】:

    标签: laravel datatables yajra-datatable


    【解决方案1】:

    使用 columns.searchable

    使用此参数,您可以定义 DataTables 是否应将此列包含在表中的可过滤数据中。您可能希望使用此选项来禁用对生成的列的搜索,例如“编辑”和“删除”按钮。

       $('#example').dataTable( {
         "columnDefs": 
         [
            { "searchable": false, "targets": 0 }
         ]
       });
    

    这将禁用目标中指定的多个列的搜索。如果您想要多列,请尝试使用

    { "searchable": false, "targets": [0,1,2] }
    

    其中目标 0 1 和 2 是从 0 开始索引的列数

    【讨论】:

    • 我认为控制器上的查询是完全搞砸了事情的人..你想检查我上面编辑的部分吗?提前谢谢你
    • 您的具体问题是什么?您要求我们检查是否可以禁用某些列的搜索。现在你想让我们看看你的控制器?请具体。
    • 很抱歉,我认为这是一个误会。我想搜索某个列,但在我检查响应后,ajax searchable 不是问题的根本原因。正如我在编辑的问题中所述,问题出在查询本身上。
    • where 和 like 是搜索功能的一部分。如果您在搜索功能中输入任何内容,数据表会自动使用 like 和 where 条件从数据库中过滤掉。
    • 就是这样,如何修改搜索功能?运行配置的文件是什么?
    猜你喜欢
    • 2019-03-08
    • 2018-03-23
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多