SilverStripe - sum()有限的数据对象变量列表

时间:2014-02-15 19:44:10

标签: php silverstripe

在SilverStripe中,我想计算前三个DataObjects的总和,以获得一个子数量。

我尝试了以下操作,但该函数始终返回所有DataObjects的总和,而不仅仅是前三个。

public function getSubSum() {
    $service = ServiceProvided::get()->filter(array(
        'InvoiceObjectID' => $this->ID
    ));
    $sum = $service->limit(3, 0)->sum('Sum');
    return $sum;
}

如何计算前三个DataObjects的总和?

2 个答案:

答案 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;
}