首页 > 解决方案 > Yajra 数据表将可变数量的自定义列附加到行

问题描述

伙计们,

我们有一个应用程序(运行 laravel 5.2 + php5.6),它的众多功能之一涉及库存控制,通过一系列报告。

无论如何,该报告系统的组成部分之一涉及显示一个数据表,该应用程序在该数据表中反映了股票的季度消耗量。

例如:

Stock | Q1-2019 | Q2-2019 | Q3-2019

A     | 1203    | 1500    | 1345

问题是,股票和日期范围都是可变的。

这意味着一个简单的查询不会削减它(afaik。如果我错了,请纠正我)。因此,我必须以某种方式获取库存,并为每个项目计算季度使用量。

到目前为止,我解决这个问题的方法如下(伪代码):

    $stocks = Stock::select([
        'id',
        'name'
      ])->get();

    $stocks->each(function ($item) use ($date_from, $date_to) {
      $item->totals = DB::select(DB::raw("SELECT
        YEAR(stock_used.use_date) as year,
        QUARTER(stock_used.use_date) as quarter,
        CONCAT(QUARTER(stock_used.use_date), 'Q-', YEAR(stock_used.use_date)) as identifier,

        SUM(stock_used.quantity) as quantity

        FROM stock_used

        WHERE stock_used.use_date BETWEEN '$date_from' AND '$date_to'
        AND stock_used.status = 'used'
        AND stock_used.stock_id = {$item->id}

        GROUP BY quarter,year
      "));

      return $item;
    });


    return Datatables::of($stocks)
      ->filter(function ($query) {
          $searchterm = request()->input('filter');

          if ($searchterm) {
              $query->where('name', 'like', "%" . $filter . "%");
          }
      })
      ->make(true);
  }

问题:这会遍历整个表格,目前还可以,并且让我能够在最后期限之前完成,但它很容易将加载时间变成爱情克拉夫特式的噩梦。

相反,由于我知道 Yajra Datatables 模块正在使用分页,我想告诉它对将要实际提供的数据中的每个元素执行上面的查询(即当前页面,而不是整个表.)

非常感谢你们,伙计们。

标签: laraveldatatablesyajra-datatable

解决方案


事实证明,我所描述的确实存在。解决方案大致如下(请记住,这是简化的,因为我的实际查询很容易大约 60 行,但如果您遇到类似的问题,您希望能得到图片。):

  return Datatables::of($materiales)
      ->addColumn('totals', function(Stock $stock) use ($date_from, $date_to) {
        return DB::select(DB::raw("SELECT
          YEAR(stock_used.use_date) as year,
          QUARTER(stock_used.use_date) as quarter,
          CONCAT(QUARTER(stock_used.use_date), 'Q-', YEAR(stock_used.use_date)) as identifier,

          SUM(stock_used.quantity) as quantity

          FROM stock_used

          WHERE stock_used.use_date BETWEEN '$date_from' AND '$date_to'
          AND stock_used.status = 'used'
          AND stock_used.stock_id = {$stock->id}

          GROUP BY quarter,year
        "));
      })

      ->filter(function ($query) {
        $searchterm = request()->input('stockFilter');

        if ($searchterm) {
            $query->where('name', 'like', "%" . $searchterm . "%");
        }
      })
      ->make(true);

推荐阅读