首页 > 解决方案 > Laravel Yajra 不接受 post/get 查询请求

问题描述

我正在使用 Yajra 数据表。在我决定过滤结果之前,它工作正常。例如:这就是我对 Yajra 的查询(在控制器中)的样子

if ($request->ajax()) {

        $data = product::get(); //SQL QUERY

        return Datatables::of($data)
                ->addIndexColumn()                    
                ->addColumn('action', function($row){
 
                    $btn = '<a href="'.url('product/{'.base64_encode($row->id).'}').'" class="edit" target="_blank"><i class="fa fa-eye" aria-hidden="true"></i></a> <a href="'.url('/').'/export?product_id='.$row->id.'&productname='.$row->product_name.'"><i class="fa fa-download" aria-hidden="true"></i></a>';

                        return $btn;
                })
                ->rawColumns(['image','discount','dt','action'])
                ->make(true);
    }

如您所见,这就是我定义 sql 查询的方式,并且工作正常。

$data = product::get();

但后来我决定过滤结果。我不想显示所有结果,而是在 POST 函数的帮助下根据 where 条件显示一些结果。

所以我用这个替换了之前的查询行

 $data = product::select('*');
    
  //POST request
  if($request->has('vendor_list')){
    $data = $data->where('vendor', $request->vendor_list);
  }
       $data = $data->get();

为了检查是否$request->vendor_list真的有一些价值,我尝试打印$request->vendor_list并且价值被打印出来。SO$request->vendor_list有内在价值。

当我尝试在 where 条件下手动添加值而不是 POST 函数时,它开始工作。像这样

$data = product::select('*');
$data = $data->where('vendor', 'vendor_name'); //MANUALLY typed value
$data = $data->get();

因此,如果我从 GET 或 POST (都尝试过)获得价值,那么不知道为什么 yajra 不接受在 where 条件下的价值?

更新

查看文件

<form action="" id="search_formm" method="GET">
    @csrf
    <div class="row">
        <div class="col-md-12">
            <div class="search_box">
                <div id="category_wrap" style="display: none;">
                    <div class="form-group">  
                        <label>Select category</label>
                        <select name="category_list" id="category_list" class="form-control">
                          <option value="">Select</option>
                            @foreach($categories as $category)
                                <option value="{{$category->category_name}}" @if(request()->category_list == $category->category_name) selected @endif>{{$category->category_name}}</option>
                            @endforeach
                        </select>
                    </div>
                </div>
                <div id="vendor_wrap" style="display: none;">
                    <div class="form-group">  
                        <label>Select Vendor</label>
                        <select name="vendor_list" id="vendor_list" class="form-control">
                          <option value="">Select</option>
                            @foreach($vendors as $vendor)
                                <option value="{{$vendor->vendor_name}}" @if(request()->vendor_list == $vendor->vendor_name) selected @endif>{{$vendor->vendor_name}}</option>
                            @endforeach
                        </select>
                    </div>
                </div>
                <div class="form-group">
                    <input type="submit" id="search-btnn" class="btn btn-primary" value="Search">
                </div>
            </div>
        </div>
    </div>
</form>
    <!--BELOW THIS FORM I AM USING YAJRA SCRIPT AND TABLE TAGS TO PRINT?SHOW ROWS FROM DB-->

控制器功能

function productList(Request $request){
    if ($request->ajax()) {

        $data = product::select('*');

        if($request->has('category_name')){
            $data = $data->where('category', $request->category_name);
        }

        if($request->has('vendor_list')){
            $data = $data->where('vendor', $request->vendor_list);
        }

         $data = $data->get();

        return Datatables::of($data)
                ->addIndexColumn()
                ->addColumn('image', function($row){
                    if(!empty($row->product_image)){
                        $image = '<a href="'.asset('dashboard_assets/images/'.$row->product_image).'" target="_blank"><img src="'.asset('dashboard_assets/images/'.$row->product_image).'" height="60"></a>';
                    }else{
                        $image = 'NA';
                    }

                     return $image;
             })
                ->addColumn('dt', function($row){
 
                    $date = date("m/y", strtotime($row->created_at));

                     return $date;
             })
             ->addColumn('discount', function($row){
                
                if(!empty($row->product_discount)){
                    $discount = $row->product_discount.'%';
                }else{
                    $discount = 'NA';
                }

                 return $discount;
         })
                ->addColumn('action', function($row){
 
                    $btn = '<a href="'.url('product/{'.base64_encode($row->id).'}').'" class="edit" target="_blank"><i class="fa fa-eye" aria-hidden="true"></i></a> <a href="'.url('/').'/export?product_id='.$row->id.'&productname='.$row->product_name.'"><i class="fa fa-download" aria-hidden="true"></i></a>';

                        return $btn;
                })
                ->rawColumns(['image','discount','dt','action'])
                ->make(true);
    }

    return view('products');
}

标签: laravelyajra-datatable

解决方案


据我了解,您正在尝试与 yajra 数据表lazy loading一起实现。real-time searching对于初学者,您不必使用,get()因为它不会实现延迟加载。Yajra-datatable 足够聪明,可以将它与按列名搜索一起使用。

但是,您仍然需要手动进行搜索,请按照操作。这是非常直接的实现。

此外,如果您计划连接多个数据库表或数据库表的列名名称与数据表的列名不匹配,请确保正确映射两个列名。您可以在此处找到参考。

    <script type="text/javascript">
    $(function () {
    
    var table = $('.yajra-datatable').DataTable({
        processing: true,
        serverSide: true,
        ajax: "{{ route('product.list') }}", //or you can use the url with the parameters like /product/1 or prodcut?vendor=1
        columns: [
            {data: 'DT_RowIndex', name: 'DT_RowIndex'},
            {data: 'name', name: 'name'},
            {data: 'vendor', name: 'vendor'},
            {data: 'data_table_column', name: 'db_table_column'},
            .
            .
            {
                data: 'action', 
                name: 'action', 
                orderable: false, 
                searchable: false
            },
        ]
    }); 

这就是你所要做的。其余的(搜索/排序)将处理 yajra-datables。

现在,如果您有任何参数必须通过 url/request 传递,然后获取它们。并检查它们是否为空。

   $vendor = $request->vendor;
   $data = null;
   if(is_null($vendor)) {
      $data = Product::query();
   } else {
      $data = Product::where('vendor', $vendor);
   }
   
   return $data->....

原因,如果供应商是,null那么 laravel 正在检查vendor数据库中是否有任何等于null. 没有什么是匹配的,它返回一个空对象。也许这就是为什么您没有收到任何错误,但也没有收到任何数据的原因。


推荐阅读