sum 不使用 get() 时有什么影响? Laravel 5.3

What is the effect when the sum does not use get() ? Laravel 5.3

我有100万条数据

当我 sum 使用 get() 时:

$cache = Summary::where('type', $type)
                ->where('keys->year', '=', (string)$year)
                ->get();
$summary = $cache->sum('summary');

很慢

但是当我 sum 不使用 get() 时,像这样:

$cache = Summary::where('type', $type)
                ->where('keys->year', '=', (string)$year);
$summary = $cache->sum('summary');

速度非常快

sum不使用get是否可以?

如果您使用 ->get() ,您实际上是在从数据库中检索信息。如果您有很多行,这会大大降低查询速度。

->sum() 只是对行求和,与 ->get() 相比,这是一种轻量级的方法。

如果您实际上不需要行中的信息,而只需要所有行的总和,您应该只使用 ->sum() 而不是 ->get() 。您不需要使用 ->get() 来让 ->sum() 工作。

Laravel Documentation 包含以下示例:

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');

两者都不使用 ->get() 来计算 ->count() 或 ->max()。

我想你甚至可以这样做:

$sum = Summary::where('type', $type)->where('keys->year', '=', (string)$year)->sum();

使用 get() 获取所有数据,然后您手动查找检索到的数据集合的总和。但是,当您不使用 get() 时,$cache 仍然是一个查询,并且在查询中获取总和将 运行 是对数据库的聚合查询,而不是获取所有数据。

$summary = Summary::where('type', $type)
    ->where('keys->year', '=', (string)$year)
    ->sum('summary');