【发布时间】:2021-10-27 03:09:51
【问题描述】:
我正在使用 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 并且价值正在被打印出来。所以$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');
}
【问题讨论】:
-
您检查的是 $request->has('vendor'),而不是 vendor_list.
-
@CuongLeNgoc 是的,我知道。我收到了多个 POST 值。即使我删除 if 条件仍然 Yajra 不允许我在 where 条件下使用任何 php 变量或 Post $request。
-
@CuongLeNgoc 即使在 php 变量中使用存储
$request->vendor_list值并在像$data = $data->where('vendor', $vendor);这样的地方使用该变量,它仍然不起作用。似乎 yajra 只接受引用中的手动值,而不是变量(在 where 条件下)。 -
尝试 $data = product::where('vendor', $request->vendor_list); return Datatables::of($data) ->addIndexColumn() 所以不需要调用 get 因为数据表句柄
-
你能发布你得到的错误吗?