从一个雄辩的模型实例中调用查询构建器方法

时间:2017-08-04 15:11:28

标签: php performance laravel laravel-5 orm

我是Laravel的新手和一般的活跃记录。如果这是一个愚蠢的问题,我会提前道歉。但我想确定我的想法是否正确。

背景:

laravel文档在雄辩的ORM部分中说:

  

由于Eloquent模型是查询构建器,因此您应该查看所有的   查询构建器上可用的方法。您可以使用其中任何一种   您的Eloquent查询中的方法。

多次提到,在处理非常大的数据时,雄辩的查询并不是很好,而且通常最好使用基本查询构建器。

我想知道声明:

  

您可以在Eloquent查询中使用这些方法中的任何一种。

我读过的很多例子将两者分开(E.G。

DB::table('table')->get();

通常比

model::all()

)比较表现。

我打算用Laravel创建我的新项目,并考虑使用这两种功能(基本查询构建器方法处理复杂和大型数据,然后使用特定的雄辩方法处理其他任何内容)。

我的问题:

我正在考虑如何使我的代码可读,干净且合理有效。我将处理可能的大数据(E.G.数千到数百万行和20到30个表在两个数据库上)。这样说是安全的:

DB::table('table')->get();

与:

相同
MODEL::get();

并假设两者都只返回一个集合,在大数据中通常比

更快
MODEL::all();

?感谢。

1 个答案:

答案 0 :(得分:5)

重要的是要看每个陈述的回报差异。虽然两者都会返回一个集合,但是集合中的项目会产生不同。

DB::table('table')->get()

返回一个stdClass对象的集合,而Laravel没有进行额外的处理。如果您使用的是SoftDeletes,则会忽略该功能。它还将返回行中的所有字段。

MODEL::get()

返回一组MODEL。 Laravel会将每个结果加载到一个新的MODEL实例中。像SoftDeletes这样的特性以及像hidden []和visible []这样的属性将得到尊重。

根据您将要做的具体数据,可能是决定因素。如果您在回复中返回它,您可能希望使用MODEL方法,因此特性和属性得到尊重。如果您正在处理返回的数据用于其他用途,那么DB方法可能是最好的。