如何过滤或排序由控制器修改的列以显示另一个数据,如此列用于显示vendor_id但是从控制器我编辑此表以显示vendor_id的名称,所以我想过滤,现在对名称进行排序而不是id !我想在表中显示所有检查信息,同时我想显示供应商的名称,此名称存在于供应商表中,并且vendor_id存在于支票表和供应商表中,还希望仅显示类别名称存在于excategories中table和类别id在检查表中
我有3张桌子:
Excategories模型
public function checks()
{
return $this->hasMany(Checks::class);
}
public function vendors()
{
return $this->hasMany(Vendors::class);
}
供应商型号:
public function checks()
{
return $this->hasMany(Checks::class);
}
public function categories()
{
return $this->belongsTo(Excategories::class);
}
检查型号:
public function scopeBetween($query, Carbon $from, Carbon $to)
{$query->whereBetween('postingdate', [$from, $to]); }
public function vendors()
{return $this->belongsTo(Vendors::class);}
public function categories(){
return $this->belongsTo(Excategories::class);}
数据表中的输入:
var oTable = $('#users-table').DataTable({
dom: 'flBrtip',
stateSave: true,
paging: true,
pagingType: 'simple_numbers',
lengthMenu: [ [10,15, 30, 50, -1 ], [ 10,15, 30, 50, "All" ] ],
processing: true,
serverSide: true,
ajax: {
url: 'custom-filter-data',
data: function(d) {
d.start_date = $('input[name=start_date]').val();
d.end_date = $('input[name=end_date]').val();
}
},
columns : [
{data: 'details', name: 'details'},
{ data: 'postingdate', render: function (data) {
var date = new Date(data);
var month = date.getMonth() + 1;
return (month.length > 1 ? month : "0" + month) + "/" + date.getDate() + "/" + date.getFullYear();} },
{data: 'description', name: 'description'},
{data: 'amount', name: 'amount'},
{data: 'type', name: 'type'},
{data: 'vendor_name',mRender: function (data, type, row) {
return '<label hidden>'+data+'</label> <input type="text" id="vendor_name"
class="vendor_name" data-id="'+row.id+'" onClick="this.select();" value="'+data+'">';}},
{data: 'vendor_id', mRender: function (data, type, row) {
return '<label hidden>'+data+'</label> <input type="text" id="vendor_no"
class="vendor_no" onClick="this.select();" value="'+data+'">';}},
{data: 'category_id',mRender: function (data, type, row) {
return '<label hidden>'+data+'</label> <input type="text" id="category_name" class="category_name" data-id="'+row.id+'" onClick="this.select();" value="'+data+'">';}},
],
pageLength: 10,
});
oTable.draw();
调节器
public function getCustomFilterData()
{
$arrStart = explode("/", Input::get('start_date'));
$arrEnd = explode("/", Input::get('end_date'));
$start = Carbon::create($arrStart[2], $arrStart[0], $arrStart[1], 0, 0, 0);
$end = Carbon::create($arrEnd[2], $arrEnd[0], $arrEnd[1], 23, 59, 59);
$orders = Checks::between($start, $end);
return Datatables::of($orders)
->editColumn('category_id', function ($user) {
$category =Excategories::where('category_id',$user->category_id)->first();
return ( @$category->category_name);
})
->editColumn('vendor_id', function ($user) {
$category =Vendors::where('vendor_id',$user->vendor_id)->first();
return ( @$category->vendor_name);
}) ->addColumn('vendor_no', '{{$vendor_id}}')
->make( TRUE );
}
如果要使用数据库查询过滤数据,则应将检查表连接到类别表而不是编辑列,以便在查询结果中有类别名称,然后可以对其进行过滤
供应商表的示例:
$vendorTableName= with(new Vendors())->getTable();
$orders = Checks::select(["checks.*","vendors.name"])->between($start, $end)->join($vendorTableName,$vendorTableName.".vendor_id","=","checks.vendor_id");
然后,为了获取供应商的名称,您可以在dataTable中使用vendors.name列。类别名称也是一样的。