find()、findOrFail()、first()、firstOrFail()、get()、list()、toArray() 有啥区别
Posted
技术标签:
【中文标题】find()、findOrFail()、first()、firstOrFail()、get()、list()、toArray() 有啥区别【英文标题】:What is the difference between find(), findOrFail(), first(), firstOrFail(), get(), list(), toArray()find()、findOrFail()、first()、firstOrFail()、get()、list()、toArray() 有什么区别 【发布时间】:2016-01-06 17:45:48 【问题描述】:这些方法有什么区别:
find()
findOrFail()
first()
firstOrFail()
get()
list()
toArray()
我一直在使用它们,每个都给出不同的结果,有时我需要在get()
的末尾添加toArray()
,因为我的函数需要一个数组。其他方法不也产生数组吗?
【问题讨论】:
看看Query Builder docs,以及Eloquent API reference。 @Joseph Silber 提供的所有信息都是正确且非常有用的。我想从 Laravel 5.2 中添加对 list() 的答案 Collection、查询构建器和 Eloquent 查询构建器对象上的 list 方法已重命名为 pluck。方法签名保持不变。 【参考方案1】:可能情况发生了变化,但 findorFail 方法可以采用 2 个参数:分别为 $id
和 $columns
混合/数组参数。不需要传递第二个参数。也就是说,这会起作用:
$post = Post::findOrFail([1,2], ['title', 'subtitle']);
如果$ids
之一失败,将抛出带有消息“No query results for model ...”的ModelNotFoundException
。
【讨论】:
【参考方案2】:find($id)
接受一个 id 并返回一个模型。如果不存在匹配的模型,则返回null
。
findOrFail($id)
接受一个 id 并返回一个模型。如果不存在匹配的模型,则会抛出错误1。
first()
返回在数据库中找到的第一条记录。如果不存在匹配的模型,则返回null
。
firstOrFail()
返回在数据库中找到的第一条记录。如果不存在匹配的模型,则会抛出错误1。
get()
返回与查询匹配的模型集合。
pluck($column)
返回仅包含给定列中的值的集合。在之前的 Laravel 版本中,这个方法被称为 lists
。
toArray()
将模型/集合转换为简单的 php 数组。
注意: a collection 是一个增强的数组。它的功能类似于数组,但有很多附加功能,如您在the docs 中所见。
不幸的是,PHP 不允许您在任何可以使用数组的地方使用集合对象。例如,在foreach
循环中使用集合是可以的,但将其传递给array_map
则不行。同样,如果您将参数类型提示为array
,PHP 不会让您将集合传递给它。从 PHP 7.1 开始,有 iterable
typehint,它可用于接受数组和集合。
如果您想从集合中获取普通数组,请调用其all()
方法。
1findOrFail
和 firstOrFail
方法抛出的错误是 ModelNotFoundException
。如果你自己没有发现这个异常,Laravel will respond with a 404,这是你大部分时间想要的。
【讨论】:
感谢您的清理。事情是这样的,我正在尝试获取类似$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
这样的帖子列表,这样我就可以访问$post->subreddit->moderators->user_id
,但这就是给Undefined property: Illuminate\Database\Eloquent\Collection::$user_id
- 我可以访问$post->subreddit->moderators
,但当我添加user_id
时不能访问 - 为什么是那个?
subreddit
是单个模型,具有moderators
属性。 moderators
是一个集合,而不是单个模型。您无法直接访问任何内容。如果您愿意,可以查看第一个:$post->subreddit->moderators[0]->user_id
我认为你应该将“它抛出一个错误”替换为“它抛出一个 ModelNotFoundException 异常”:D 无论如何伟大的贡献;)
@JosephSilber 完美!
您的意思是“实例”,而不是“模型”。模型是概念结构或示例,而不是实际实例。让我们清楚地使用我们的术语。可悲的是,在 Eloquent 世界中,人们可以互换使用这两个术语。实例不是模型。实例是模型的真实实现(对象版本)。以上是关于find()、findOrFail()、first()、firstOrFail()、get()、list()、toArray() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::find_if(first, last, p) 不采用引用谓词?
Find() 和 First() 抛出异常,如何改为返回 null?