Laravel 5.2.43 vs 5.2.45(Eloquent Sum返回null而不是0)?

时间:2016-10-04 05:22:09

标签: laravel-5 eloquent laravel-5.2

只想了解上述两个版本之间的区别,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时,整个操作都会折叠。

我的查询是,它是一个功能还是一个错误?如果有功能,是否有更好的替代方案来改变行为?或者我必须更改我的代码才能接受此功能?

1 个答案:

答案 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个选择:

  1. 回到Laravel 5.43(通过更新composer.json)或

  2. 调整代码以处理空值。

  3. 暂时更改供应商源代码(但我不建议这样做)