【问题标题】:Yajra Datatables append variable amount of custom columns to rowsYajra 数据表将可变数量的自定义列附加到行
【发布时间】:2019-11-13 11:59:17
【问题描述】:

伙计们,

我们有一个应用程序(运行 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 模块正在使用分页,我想告诉它对将要实际提供的数据中的每个元素执行上述查询(即当前页面,而不是整个表。)

非常感谢你们,伙计们。

【问题讨论】:

  • 利用分页需要做的是将 QueryBuilder 对象传递给DataTables::of()。使用您的表和模型关系更新您的问题,与原始查询相比,有人可能会发现提取此数据的更好方法。
  • 实际的关系很容易跨越 8 或 9 个表,这里为了解释问题而进行了简化。我在最初的 Eloquent 查询中无法做到这一点,因为我可能只有一个季度、所有季度的数据,或者客户的请求可能跨越 20 年或 2 年或只有 1 个季度,所以如果不是不可能的话,似乎很难做到.另外,是的,相信我看到了实际的关系,做一个原始查询真的很容易。
  • 我的问题更多是关于如何执行现在驻留在我的每个...中的代码。在我的数据表中。不是以前。能够将我的怪物查询的结果作为包含结果数组的自定义字段附加到结果的每一行就可以了。

标签: laravel datatables yajra-datatable


【解决方案1】:

事实证明,我所描述的确实存在。 解决方案大致如下(请记住,这是简化的,因为我的实际查询很容易大约 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);

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2017-07-09
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多