Eloquent\Model::get() 和 all() 之间的区别

问题描述 投票:0回答:4

在 Eloquent 上使用

User::all()
User::get()
有什么区别?

在 Laravel API 上,它仅描述了 all()

 上的 
Eloquent\Model

也许
get()
描述于
Eloquent\Builder
上。

php laravel laravel-5 eloquent
4个回答
126
投票

User::all()
User::get()
本身会做完全相同的事情。然而,有一个关键的区别。

all()
Eloquent\Model
上的静态方法。它所做的只是创建一个新的查询对象并对其调用
get()
。使用
all()
,您根本无法修改执行的查询(除非您可以通过将列作为参数传递来选择要选择的列)。

get()
Eloquent\Builder
对象上的方法。如果需要修改查询,例如添加where子句,那么就必须使用
get()
。例如,
User::where('name', 'David')->get();


12
投票

为了进一步阐明为什么这是有效的,这是因为 Model 类中有一个神奇的方法,它将接受任何未定义的静态调用,创建一个实例,然后为您调用该实例上的方法。

您可以在此处的源代码中看到它:https://github.com/laravel/framework/blob/5.6/src/Illuminate/Database/Eloquent/Model.php(第1580行)

这在 Laracast 剧集中也有解释:https://laracasts.com/series/advanced-eloquent/episodes/3(需要订阅)

当我第一次遇到这个并且找不到

get()
作为静态方法时,我也很困惑。但后来我想起了 Laracast 的那一集,它帮助我把这些点联系起来。


8
投票

get() 用于添加查询,all() 用于获取所有数据,不使用任何条件。

all() 的示例:

$query = Project::all();

get() 示例:

$query = Project::select('id', 'name')->where('name', '')->orderBy('id', 'desc')->get();

0
投票

在 Laravel 的 Eloquent 中,Eloquent\Model::get() 和 all() 都是用于从数据库表中检索所有记录的方法。然而,两者之间有细微的差别

1.Eloquent\Model::get():

  • get() 方法比 all() 方法更通用。
  • 它允许您在执行查询之前链接其他方法来修改查询。例如,您可以使用 get() 以及 where、orderBy、groupBy 和其他查询构建器方法来对检索到的数据进行过滤、排序或执行其他操作。
  • 它返回 Illuminate\Database\Eloquent\Collection 类的实例,该类提供了用于处理检索到的数据的附加方法,例如映射、过滤等。

示例: $users = User::where('active', true)->orderBy('created_at', 'desc')->get();

2.all():

  • all() 方法是从数据库表中检索所有记录的直接方法,无需任何额外的查询生成器操作。它按原样获取表中的所有行。

  • 它使用简单,但缺乏链接附加查询生成器方法的灵活性。

示例: $users = 用户::all();

因此,总而言之,当您需要对查询进行更多控制或想要应用其他条件、排序或分组时,请使用 get()。当您想要从表中获取所有记录而不需要任何额外的查询生成器操作时,请使用 all() 。

© www.soinside.com 2019 - 2024. All rights reserved.