讨论:Laravel Eloquent vs DB 查询追加

Posted

技术标签:

【中文标题】讨论:Laravel Eloquent vs DB 查询追加【英文标题】:Discussion: Laravel Eloquent vs DB queries for appends 【发布时间】:2021-05-19 18:42:25 【问题描述】:

我有一个用例,其中我有一些模型(超过 20 个),其中一个模型与其他 15 个模型有关系,还有一些特征中有一些附加。

我想就这些查询应该如何运行获得意见:

对产品表中的一些字段求和:

我应该使用这个语法吗:

$this->products()->sum('someField')

或者我应该使用:

DB::table('products')->sum('someField')

可能是一样的,但我不太确定,我之所以这么问,是因为性能非常重要,并且每毫秒保存都会受到赞赏。谢谢

【问题讨论】:

【参考方案1】:

大概用DB::table()

Eloquent 和任何其他 ORM 的经验法则是,在创建和“水合”对象时会产生大量开销,如果有相关表中的对象被查询和创建,则更糟。如果你需要做的只是得到一个总和,那么你就可以避免 ORM 的开销。

话虽如此,在这种情况下生成总和的代码应该是相似的,如果不是微优化的话,因为您使用的是模型类,所以您没有水合一个对象或对象集合。

您始终可以使用您的系统/数据对这两种不同的方法进行基准测试。无论采用哪种方式,sum 都是一个 SQL 聚合,它将生成相似或完全相同的 SQL,并返回一个数字而不是一个对象,其中 ORM 可能会查询有关水合和相关对象集合的填充的问题。

【讨论】:

【参考方案2】:

就大数据而言,查询构建器在性能方面更快更好,但如果您只对一条记录或几条记录感兴趣,则最好使用 eloquent。

如果您正在寻找更好的关系,Eloquent 比查询构建器更好。

在你的情况下,你对速度更感兴趣,你最好的选择是查询生成器

DB::table('products')->sum('someField')

【讨论】:

以上是关于讨论:Laravel Eloquent vs DB 查询追加的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/Eloquent/DB 查询 - 当为空且不为空时加入

Laravel Eloquent ORM 事务

laravel transaction : laravel 的事务是不支持eloquent的, 要用DB::的方式

如何在没有 Eloquent 的情况下创建 Laravel 模型?

使用laravel框架的eloquent模型连接多个数据库

Laravel Eloquent/DB 选择每组前 1 行