【问题标题】:What is the effect when the sum does not use get() ? Laravel 5.3当 sum 不使用 get() 时有什么影响?拉拉维尔 5.3
【发布时间】:2017-05-15 16:27:29
【问题描述】:

我有 100 万条数据

当我使用sum 时,像这样使用get()

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

很慢

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

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

速度很快

sum不使用get是否可以?

【问题讨论】:

  • 没有 get() 你的语句不会被执行。
  • @Friedrich Roell,我在没有get 的情况下执行sum,它已执行

标签: php laravel sum laravel-5.3 laravel-eloquent


【解决方案1】:

如果你使用 ->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() 在这种情况下没有效果。
【解决方案2】:

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

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

【讨论】:

  • 这是否意味着结论是可以做到的?没有效果。例如错误等
  • @samueltoh 的结论是这是正确的方法,无需使用 get()。没有错误或问题,这是正确的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2017-03-16
  • 2018-10-18
  • 2017-02-07
  • 2017-06-16
相关资源
最近更新 更多