只想了解上述两个版本之间的区别,Laravel v.5.2.43和v.5.2.45。
我发现了以下不同之处:
// 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时,整个操作都会折叠。
我的查询是,它是一个功能还是一个错误?如果有功能,是否有更好的替代方案来改变行为?或者我必须更改我的代码才能接受此功能?
答案 0 :(得分:1)
比较\ Illuminate \ Database \ Query \ Builder的和方法 (文件位于:vendor / laravel / framework / src / Illuminate / Database / Query / 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 5.2.45:
/**
* 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()函数在5.2.45
中具有强制转换为(int)return (int) $this->aggregate(__FUNCTION__, $columns);
另请查看该文件的commit history: 他们使用numericAggreate()修复了聚合函数,但后来又被恢复了。
由于这是某些应用程序的重大变化,我会说这种不受欢迎的行为,但我并不完全确定。
您可以在laravel github存储库中创建新的issue。
在此之前,您只有3个选择:
回到Laravel 5.43(通过更新composer.json)或
调整代码以处理空值。
暂时更改供应商源代码(但我不建议这样做)