2016-10-04 58 views
1

只是想了解兩個提到的版本,Laravel v.5.2.43和v.5.2.45之間的區別。Laravel 5.2.43 vs 5.2.45(Eloquent Sum返回null而不是0)?

我觀察到以下差別:

// 5.2.43 
// Returns 0 in case if there nothing with name Coffee 
Product::where('name','Coffee')->sum('weight'); 

// 5.2.45 
// Returns NULL in case if there nothing with name Coffee 
Product::where('name','Coffee')->sum('weight'); 

我有一個報告工具,整個操作都倒塌時,值NULL在以前的版本中返回一個0來代替。

我在這裏的查詢是,它是一個功能或錯誤?如果功能,是否有更好的選擇來改變行爲?或者我必須更改我的代碼才能接受此功能?

回答

1

比較\照亮\數據庫的總和方法\查詢\生成器 (文件位於:供應商/ laravel /框架/ SRC /照亮/數據庫/查詢/ Builder.php)

Laravel 5.2。 43

/** 
* Retrieve the sum of the values of a given column. 
* 
* @param string $column 
* @return float|int 
*/ 
    public function sum($column) 
    { 
     $result = $this->aggregate(__FUNCTION__, [$column]); 

     return $result ?: 0; 
    } 

Laravel 45年2月5日:

/** 
* Retrieve the sum of the values of a given column. 
* 
* @param string $column 
* @return mixed 
*/ 
public function sum($column) 
{ 
    return $this->aggregate(__FUNCTION__, [$column]); 
} 

所以在5.43中,如果$ result是NULL,而是返回0。

我不完全知道這是因爲 例如count()函數在45年2月5日

return (int) $this->aggregate(__FUNCTION__, $columns); 

強制轉換爲(INT)的開發者預期的行爲也有看該文件的commit history: 他們通過使用numericAggreate()修復了聚合函數,但稍後再次恢復。

由於這是一些應用程序的突破性變化,我會說這種不想要的行爲,但我並不完全確定。

您可以在laravel github存儲庫中自由創建一個新的issue

在那之前,你只有3種選擇:

  1. 回到Laravel 5.43(通過更新composer.json)OR

  2. 調整你的代碼來處理空值。

  3. 臨時更改供應商的源代碼(但我不會推薦)

+0

是啊,似乎是公平的,我猜這樣。我相信它的默認情況下,你期望一個整數。我現在只會提出一個問題,現在回退到5.2.43 ..!非常感謝 :) –