find(),findOrFail(),first(),firstOrFail(),get(),list(),toArray()之间有什么区别


107

这些方法之间有什么区别:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. toArray()

我一直在使用它们,但是每个函数都给出不同的结果,有时我需要toArray()在末尾添加,get()因为我的函数期望使用数组。其他方法也不会产生数组吗?



@Joseph Silber提供的所有信息都是正确且非常有用的。我想从Laravel 5.2中为list()添加答案。Collection,查询构建器和Eloquent查询构建器对象上的list方法已重命名为pluck。方法签名保持不变。
尼拉夫·布伊

Answers:


224
  1. find($id)接受一个I​​D并返回一个模型。如果不存在匹配的模型,则返回null

  2. findOrFail($id)接受一个I​​D并返回一个模型。如果不存在匹配的模型,则会引发错误1

  3. first()返回在数据库中找到的第一条记录。如果不存在匹配的模型,则返回null

  4. firstOrFail()返回在数据库中找到的第一条记录。如果不存在匹配的模型,则会引发错误1

  5. get() 返回与查询匹配的模型的集合。

  6. pluck($column)返回仅给定列中的值的集合。在以前的Laravel版本中,此方法称为lists

  7. toArray() 将模型/集合转换为简单的PHP数组。


注意: 集合是一个增强的数组。它的功能类似于数组,但具有许多附加功能,如docs中所示

不幸的是,PHP不允许您在可以使用数组的任何地方使用集合对象。例如,在foreach循环中使用集合是可以的,但将其传递给array_map它不是。同样,如果您将参数类型提示为array,PHP将不允许您将其传递给集合。从PHP 7.1开始,有iterabletypehint,它可以用来接受数组和集合。

如果要从集合中获取纯数组,请调用其all()方法。


1findOrFailfirstOrFail方法引发的错误是ModelNotFoundException。如果您自己没有捕获到此异常,Laravel将以404响应,这是您大多数时候想要的。


1
谢谢您的清理。这就是问题,我正在尝试获取这样的帖子列表,$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-为什么?
Halnex

subreddit是具有moderators属性的单个模型。moderators是一个集合,而不是单个模型。您无法直接访问任何内容。您可以根据需要检查第一个:$post->subreddit->moderators[0]->user_id
Joseph Silber

我认为您应该将“它引发错误”替换为“它引发ModelNotFoundException异常”:D不管怎么说,他的贡献很大;)
bobbybouwmann

@JosephSilber完美!
bobbybouwmann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.