首页 > 解决方案 > 服务器端 Jquery 数据表在 laravel (FIxed) 中显示请求的未知参数,但 ssearching 不能按地址名称工作

问题描述

以前的问题已解决,但当我尝试按地址名称搜索时,当前搜索不起作用。

供您参考,我正在使用“https://datatables.net/examples/data_sources/server_side”这个 jquery 数据表。公司和地址之间存在一对多的关系(例如,一家公司有多个地址)。

迁移:公司

    {
        Schema::create('companies', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

迁移:地址

public function up()
    {
        Schema::create('addresses', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->unsignedBigInteger('company_id')->nullable();
            $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
            $table->timestamps();
        });
    }

型号:公司

    public function addresses()
    {
        return $this->hasMany(Address::class);
    }

型号:地址

public function company()
    {
        return $this->belongsTo(Company::class);
    }

公司控制器

public function index(Request $request)
    {
        if(request()->ajax()){
            $columns = array(
                0 => 'id',
                1 => 'name',
                2 => 'addresses',
                3 => 'action'
            );

            $totalData = Company::count();

            $limit = $request->input('length');
            $start = $request->input('start');
            $order = $columns[$request->input('order.0.column')];
            $dir = $request->input('order.0.dir');

            if(empty($request->input('search.value'))){
                $companies = Company::offset($start)
                    ->limit($limit)
                    ->orderBy($order,$dir)
                    ->get();
                $totalFiltered = Company::count();
            }else{
                $search = $request->input('search.value');
                $companies = Company::where('name', 'like', "%{$search}%")
                    ->whereHas('addresses',function ($q) use ($search){
                        $q->orWhere('addresses.name','like',"%{$search}%");
                    })
                    ->offset($start)
                    ->limit($limit)
                    ->orderBy($order, $dir)
                    ->get();
                $totalFiltered = Company::where('name', 'like', "%{$search}%")
                    ->whereHas('addresses',function ($q) use ($search){
                        $q->orWhere('addresses.name','like',"%{$search}%");
                    })
                    ->count();
            }


            $data = array();
            $serialNo = $request->input('start');

            if($companies){
                foreach($companies as $key => $company){
                    $edit = route('companies.edit', $company->id);

                    $serialNo++;

                    $nestedData['serial'] = $serialNo;
                    $nestedData['name'] = $company->name;

                    $addresses = Address::select("*")->where('company_id',$company->id)->get();

                    $nestedData['addresses'] = array();
                    foreach ($addresses as $address){
                        array_push($nestedData['addresses'],$address->name);
                    }

                    $nestedData['action'] = "
                    <a href='{$edit}' title='Edit' class='btn btn-warning edit'><span class='fa fa-user-edit' style='color: whitesmoke'></span></a>
                    <button class='btn btn-danger' data-userid={$company->id} data-toggle='modal' data-target='#delete'><span class='fa fa-trash'></span></button>
                ";
                    $data[] = $nestedData;
                }
            }

            $json_data = array(
                "draw"          => intval($request->input('draw')),
                "recordsTotal"  => intval($totalData),
                "recordsFiltered" => intval($totalFiltered),
                "data"          => $data
            );

            return response($json_data);

        }

公司索引中的 Ajax 脚本

<script>
        $('#ajaxDatatable').DataTable({
            "oLanguage": {
                "sProcessing": "<span>Please wait...</span>"
            },
            "paging": true,
            "lengthMenu": [
                [10, 25, 50],
                [10, 25, 50]
            ],
            "processing": true,
            "serverSide": true,
            "ajax": {
                "url": "{{route('companies.index')}}",
                "dataType": "json",
                "type": "GET",
                "data": {"_token": "{{csrf_token()}}"}
            },
            "columns": [
                {"data": "serial"},
                {"data": "name"},
                {"data": "addresses"},
                {
                    "data": "action",
                    "searchable": false,
                    "orderable": false
                }
            ],
            "scrollY": 650,
            "scrollCollapse": true
        });
    </script>

**当前通过地址名称搜索时获得的 JSON 响应:**

{"draw":4,"recordsTotal":4,"recordsFiltered":0,"data":[]}

标签: jquerysqllaraveljoinserverside-datatable

解决方案


推荐阅读