laravel - 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 模块正在使用分页,我想告诉它对将要实际提供的数据中的每个元素执行上面的查询(即当前页面,而不是整个表.)
非常感谢你们,伙计们。
解决方案
事实证明,我所描述的确实存在。解决方案大致如下(请记住,这是简化的,因为我的实际查询很容易大约 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);