这篇笔记用来整理Laravel Eloquent 的一些高级用法。
hidden/visible
有时可能会遇到需要隐藏/显示属性的需求,尽管Eloquent ORM 为我们提供了hidden
、visible
属性,但如果能动态设置,似乎更不错。
src/Illuminate/Database/Eloquent/Concerns/HidesAttributes.php
Tarit 为我们提供了几个不错的方法:
getVisible
:获取白名单setVisible
:设置白名单makeVisible
:追加白名单getHidden
:获取黑名单setHidden
:设置黑名单makeHidden
:追加黑名单
最佳实践
1 | $user = UserModel::find(1)->makeHidden(["remember_token"]); |
需要注意一点的是,虽然属性被我们隐藏了,但如果仍需要使用该属性的话,还是可以通过
->
获取到
Accessors
要定一个Accessors,需要在模型中创建一个名称为getXxxAttribute
的方法,其中的 Xxx
是驼峰命名法的字段名。
通过属性获取器,我们可以很轻松地为属性赋予新的值,但如果想要获取赋值之前的值,那么该如何做呢?
1 | /** |
src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php
Tarit 为我们提供了几个不错的方法:
getAttributes
:获取赋值之前的值getAttribute
:获取指定Key,修饰之后的值getAttributeValue
:获取指定Key,修饰之后的值setAttribute
:为属性赋值getMutatedAttributes
:获取需要赋值的Key
需要注意的是:以上这些Api 仅适用于模型的实例对象,对于集合不能直接使用
1 | UserModel::find(1)->getAttributes(); ✅ |
最佳实践
1 | $notice = NoticeModel::find(1); |
分页
数据分页有多种方法,最简单的是使用 查询构造器 或 Eloquent query 的 paginate
方法。
但有些时候,因为一些原因,我们不想使用 paginate
自动创建分页,那有没有什么办法可以手动创建分页呢?
答案是有的,Laravel 提供以下两种方式:
Illuminate\Pagination\Paginator
:相当于查询构造器或 Eloquent 的simplePaginate
方法。Illuminate\Pagination\LengthAwarePaginator
:相当于查询构造器或 Eloquent 的paginate
方法。
最佳实践
1 | UserModel::where("age", ">", 18)->paginate(15); |