Eloquent ORM 看起来是一个简单的机制,但是在底层,有很多半隐藏的函数和鲜为人知的方式来实现更多功能。在这篇文章中,我将演示几个小技巧。

1. 递增和递减

要代替以下实现:

10 个 Laravel Eloquent 必备的实用技巧

你可以这样做:

10 个 Laravel Eloquent 必备的实用技巧

以下这些方法也可以实现:

10 个 Laravel Eloquent 必备的实用技巧

2. 先执行 X 方法,X 方法执行不成功则执行 Y 方法

Eloquent 有相当一部分函数可以把两个方法结合在一起使用, 例如 『 请先执行 X 方法, X 方法执行不成功则执行 Y 方法 』。

实例 1 -- findOrFail():

要替代以下代码的实现:

10 个 Laravel Eloquent 必备的实用技巧

你可以这样写:

10 个 Laravel Eloquent 必备的实用技巧

实例 2 -- firstOrCreate():

要替代以下代码的实现:

10 个 Laravel Eloquent 必备的实用技巧

这样写就可以了:

10 个 Laravel Eloquent 必备的实用技巧

3. 模型的 boot() 方法

在一个 Eloquent 模型中,有个神奇的地方,叫 boot(),在那里,你可以覆盖默认的行为:

10 个 Laravel Eloquent 必备的实用技巧

在创建模型对象时设置某些字段的值,大概是最受欢迎的例子之一了。 一起来看看在创建模型对象时,你想要生成 UUID 字段 该怎么做。

10 个 Laravel Eloquent 必备的实用技巧

4. 带条件与排序的关联关系

定义关联关系的一般方式:

10 个 Laravel Eloquent 必备的实用技巧

你知道吗?也可以在上面的基础上增加 where 或者 orderBy?

举个例子,如果你想关联某些类型的用户,同时使用 email 字段排序,你可以这样做:

10 个 Laravel Eloquent 必备的实用技巧

5. 模型特性:时间、追加等

Eloquent模型有些参数,使用类的属性形式。最常用是:

10 个 Laravel Eloquent 必备的实用技巧

不只这些,还有:

10 个 Laravel Eloquent 必备的实用技巧

6. 通过 ID 查询多条记录

所有人都知道 find() 方法,对吧?

10 个 Laravel Eloquent 必备的实用技巧

我十分意外竟然很少人知道这个方法可以接受多个 ID 的数组作为参数:

10 个 Laravel Eloquent 必备的实用技巧

7. WhereX

有一种优雅的方式能将这种代码:

10 个 Laravel Eloquent 必备的实用技巧

转换成这种:

10 个 Laravel Eloquent 必备的实用技巧

对,你没有看错,使用字段名作为后缀添加到 where 后面,它就能通过魔术方法运行了。

另外,在 Eloquent 里也有些和时间相关的预定义方法:

10 个 Laravel Eloquent 必备的实用技巧

8. 通过关系排序

一个复杂一点的「技巧」。你想对论坛话题按最新发布的帖子来排序?论坛中最新更新的主题在最前面是很常见的需求,对吧?

首先,为主题的最新帖子定义一个单独的关系:

10 个 Laravel Eloquent 必备的实用技巧

然后,在控制器中,我们可以实现这个「魔法」:

10 个 Laravel Eloquent 必备的实用技巧

9. Eloquent::when() -- 不再使用 if-else

很多人都喜欢使用"if-else"来写查询条件,像这样:

10 个 Laravel Eloquent 必备的实用技巧

有一种更好的方法 -- 使用 when()

10 个 Laravel Eloquent 必备的实用技巧

 

它可能看上去不是很优雅,但它强大的功能是传递参数:

10 个 Laravel Eloquent 必备的实用技巧

 

10. 一对多返回默认模型对象

假设现在有种情况是要显示文章的作者,然后模板代码是:

10 个 Laravel Eloquent 必备的实用技巧

但是如果作者的信息被删除或者因为某些原因没有被设置。代码会返回一个错误,诸如 "property of non-object"。

当然你可以这样处理:

10 个 Laravel Eloquent 必备的实用技巧

你可以通过 Eloquent 关系这样做:

10 个 Laravel Eloquent 必备的实用技巧

在此示例中,如果文字没有作者的信息, author() 会返回一个空的 AppAuthor 模型对象。

再者,我们也可以给默认的模型对象里面的属性赋默认值。

10 个 Laravel Eloquent 必备的实用技巧