laravel - 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');
}
解决方案
据我了解,您正在尝试与 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
. 没有什么是匹配的,它返回一个空对象。也许这就是为什么您没有收到任何错误,但也没有收到任何数据的原因。
推荐阅读
- visual-studio - 如何使用 TFS 和 Visual Studio 从合并操作中排除文件
- entity-framework-6 - Entity Framework 6 or Core - 使用类似“DataReader”的模式读取查询结果
- java - 在不同操作系统上运行时使用 maven 编译 JAR 忽略 log4j2 属性
- javascript - 将 HTML 元素从一个页面移动到另一个页面
- c# - c#点云到网格
- mysql - MySQL 错误 1114:表已满
- javascript - 请解释 react.js 应用中上下文的使用
- c++ - 如何在 Visual Studio 2017 C++ 上添加预处理器定义?
- angular - Angular Material 概述了输入和 ngx-translate
- xml - 从日期输入面板格式化日期