2014-02-15 39 views
1

在SilverStripe中,我想計算僅前三個的總和DataObjects,以獲得子金額。SilverStripe - sum()數據對象變量的有限列表

我試過以下,但函數總是返回所有DataObjects的總和,而不僅僅是前三個。

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

如何計算僅前三個DataObjects的總和?

回答

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; 
} 
2

首先計算SUM,然後在之後應用限制已經計算了總和函數。實際上,您要求它首先計算總和,它返回一行,然後將結果限制爲三行。

要做到這一點,你可能會需要使用子查詢,如:

SELECT SUM("Sum") FROM (SELECT "Sum" FROM "ServiceProvided" WHERE ... LIMIT 3) 

要SilverStripe執行自定義SQL可以使用DB::query()。但是,這樣做時需要小心以避免SQL注入。更簡單的方法就是用PHP計算總和。

+0

嗨,thx,你能告訴我如何用php做到這一點嗎?如何獲得只有過濾和有限的變量 – invictus

+1

我建議你閱讀PHP和/或SilverStripe文檔的介紹。 – ajshort