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

Posted

技术标签:

【中文标题】Eloquent\\Model::get() 和 all() 之间的区别【英文标题】:Difference between Eloquent\Model::get() and all()Eloquent\Model::get() 和 all() 之间的区别 【发布时间】:2016-04-07 20:20:39 【问题描述】:

在 Eloquent 上使用 User::all()User::get() 有什么区别?

在 Laravel API 上,它仅在 Eloquent\Model 上描述了 all()。也许在 Eloquent\Builder 上描述了 get()

【问题讨论】:

【参考方案1】:

User::all()User::get() 会做同样的事情。

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

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

【讨论】:

【参考方案2】:

为了进一步阐明为什么会这样,这是因为 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 的那一集,它帮助我把这些点联系起来。

【讨论】:

这真是一个方便的见解。我之前没有想到为什么会这样。 Laravel 的魔力有时会让你“嗯?!” 确实!这是吸引我的原因之一。 ?【参考方案3】:

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

all() 的例子:

$query = Project::all();

get() 示例:

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

【讨论】:

以上是关于Eloquent\Model::get() 和 all() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

前缀和与差分

[Algorithm] 前缀和

Python 输入两个整数a和b,求a-b的绝对值?

a++和 a+1

Java中a=a++ 和 a=++a(转)

算法:2 个集合 A 和 B 形成总和集合 C。给定 A 和 C 找到 B