在SilverStripe中,我想计算前三个DataObjects
的总和,以获得一个子数量。
我尝试了以下操作,但该函数始终返回所有DataObjects
的总和,而不仅仅是前三个。
public function getSubSum() {
$service = ServiceProvided::get()->filter(array(
'InvoiceObjectID' => $this->ID
));
$sum = $service->limit(3, 0)->sum('Sum');
return $sum;
}
如何计算前三个DataObjects
的总和?
答案 0 :(得分:2)
首先计算SUM,然后在已经计算了总和函数之后应用限制。实际上,你要求它先计算总和,然后返回一行,然后将结果限制为三行。
为此,您可能需要使用子查询,如:
SELECT SUM("Sum") FROM (SELECT "Sum" FROM "ServiceProvided" WHERE ... LIMIT 3)
要在SilverStripe中执行自定义SQL,您可以使用DB::query()
。但是,在执行此操作时需要小心以避免SQL注入。一种更简单的方法就是用PHP计算总和。
答案 1 :(得分:0)
要计算PHP中的总和,请使用for循环遍历返回的每个数据库行,并将值添加到变量中。
public function getSubSum() {
$services = ServiceProvided::get()
->filter('InvoiceObjectID', $this->ID)
->limit(3, 0);
$sum = 0;
foreach($services as $service) {
$sum += $service->Sum;
};
return $sum;
}