laravel datatables过滤列不存在于数据库中

问题描述 投票:0回答:1

如何过滤或排序由控制器修改的列以显示另一个数据,如此列用于显示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 );
     }
php laravel datatable
1个回答
0
投票

如果要使用数据库查询过滤数据,则应将检查表连接到类别表而不是编辑列,以便在查询结果中有类别名称,然后可以对其进行过滤

供应商表的示例:

 $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列。类别名称也是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.