【问题标题】:laravel datatables filtering column not exist in databaselaravel 数据表过滤列在数据库中不存在
【发布时间】:2018-06-10 23:03:40
【问题描述】:

如何过滤或排序由控制器修改的列以显示其他数据,例如用于显示 vendor_id 的列,但从控制器我编辑此表以显示 vendor_id 的名称,所以我想过滤,现在对名称进行排序不是身份证! 我想在表中显示所有检查信息,还想显示供应商的名称,该名称存在于 Vendors 表中,并且 vendor_id 这存在于检查和供应商表中,还想显示仅存在于 excategories 中的类别名称表和类别 id 在检查表中

我有 3 张桌子:

类别模型

   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】:

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

    供应商表示例:

     $vendorTableName= with(new Vendors())->getTable();
     $orders = Checks::select(["checks.*","vendors.name"])->between($start, $end)->join($vendorTableName,$vendorTableName.".vendor_id","=","checks.vendor_id");
    

    然后为了获取供应商的名称,您可以使用 dataTable 中的 vendor.name 列。类别名称也是一样的。

    【讨论】:

    • 你能说得更清楚一点吗?这里的主表是检查,你的意思是我必须合并两个数据库?
    • 您必须将两个表与 sql join 结合起来:检查和类别
    • 我需要一个代码我不知道如何使用连接,而我使用数据表仍然是新的
    • 我需要有关您的数据库的更多信息,以便能够为您提供一些代码。检查表和分类表有什么关系?
    • 更新了,请看
    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2023-03-12
    • 2014-07-22
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多