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() 方法。


1findOrFailfirstOrFail 方法抛出的错误是 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() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中使用模型对数据进行操作

C# First() 和 Find() 的区别

为啥 std::find_if(first, last, p) 不采用引用谓词?

Find() 和 First() 抛出异常,如何改为返回 null?

相当于 Visual Studio 中位集的 .Find_first 方法

string::find_first_of