【发布时间】: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