【发布时间】:2019-12-08 14:36:06
【问题描述】:
一个度量模型有许多测量值。
我已经建立了关系,所以我可以做以下事情:
$metrics = Metric::with('measurements' => function($query) {
return $query->where('timestamp', '>=', '20190731');
});
这可用于获取 2019 年 7 月 31 日以来的所有度量标准。
但我现在想要实现的是获取聚合的测量数据。
编辑:这是对我所追求的更好的解释
如果上面给出的是这样的:
results = [
{ id: 1,
name: 'Metric 1',
measurements: [
{ id: 123, metric_id: 1, value: 4, timestamp: 2019-07-31T09:00 },
{ id: 124, metric_id: 1, value: 10, timestamp: 2019-07-31T10:00 },
...
{ id: 124, metric_id: 1, value: 10, timestamp: 2019-08-01T09:00 },
] },
...
]
那么我想要达到的结果会是这样的:;
results = [
{ id: 1,
name: 'Metric 1',
measurementStats: [
{ metric_id: 1, period: 2019-07-31, min: 4, max: 10 },
{ metric_id: 1, period: 2019-08-01, min: 10, max: 10 },
] },
...
]
我想当急切加载时,Eloquent 应该像这样运行:
SELECT metric_id,
DATE_FORMAT(timestamp, '%Y%m%d') as period,
MIN(value) AS min,
MAX(value) AS max
FROM measurements
WHERE metric_id IN (...)
GROUP BY metric_id, DATE_FORMAT(timestamp, '%Y%m%d')
有没有办法在 Eloquent/Laravel 查询构建器中实现这一点? (Laravel 5.8)
【问题讨论】:
-
能否稍微解释一下sql查询,这样要求就很容易理解了
-
@SagarGautam 感谢您抽出宝贵时间,我已经扩展了问题,是否更清楚?
-
是的,它可以做到,我做了类似的事情。您可以查看 Laravel 手册 laravel.com/docs/5.8/queries#joins 的这一页,您肯定可以自己获得它。你只需要把这些碎片放在一起。使用示例
DB: raw ("DATE_FORMAT(timestamp, '%Y%M%d') as period")进行复杂查询。 -
@NewWorldNeverland 我知道如果我放弃 Eloquent 我可以做到,但我希望有类似
function measurementStats() { return $this->hasMany(...); }这样我可以使用急切加载? -
@artfulrobot 我已经添加了我的答案试试看
标签: sql laravel laravel-5 eloquent