5 个 Laravel Eloquent 小技巧
1. 快速生成 Model & Migration
这并不是一个很多人知道的小技巧,为文章生成 Model 和 Migration。
$ php artisan make:migration create_posts_table
$ php artisan make:model Post
大部分人可能会按上面这样做,其实这两条命令可以合并为下面这一条:
$ php artisan make:model Post -m
2. Eloquent 查询 Scopes
还是以前面的博客应用为例,假设我们的文章表有一个 is_published 字段,其值为 0 或 1 (表示 False 或 True )。在博客列表,我们希望用户只能看到已经发布(published)的文章,使用 Eloquent 我们如何过滤掉未发布的文章呢?答案很明显,需要在查询语句中使用 where 条件:
Post::where('is_published', true)->get();
这当然可以,但如果我们想在其他地方重复使用这个代码段呢?这么重复复制当然也可以实现,但为了符合 DRY 原则( Don’t repeat yourself ),我们可以使用 Eloquent 的查询 Scope。在 Post 模型中创建 ascopePublished 方法:
class Post extends Model
{
public function scopePublished($query)
{
return $this->where('is_published', true);
}
}
要获取已发布文章,我们只需简单的调用如下命令:
Post::published()->get();
Eloquent 可以自己把它翻译为 scopePublished 方法。Eloquent 模型中任何以 scope 开始是方法都被当做 Eloquent scope。
值得注意的是,Eloquent scope 的返回值必须是一个查询生成器的实例,所以在 scope 中你不能调用 ->get() 或 ->paginate() 。
3. Accessors(访问器)
在很多情况下,你可能需要访问 Eloquent 模型在数据中并不存在,需要经过一定计算的属性,但很抱歉。我们来看一个例子。假设现在有一个 User 表,它包含这样两个字段:forenames和 surname 。如果你想在视图中显示用户全名的话,你不得不这么做:
{{ $user->forenames . ' ' . $user->surname }}
首先,我们的应用中可能有很多地方需要使用这段代码,一遍又一遍的输入显然很不实际。其次,呃,语法非常的丑陋且显得格格不入。下面我们来看看如何通过访问器(又称属性)使其变得更加整洁一些。我们在 User 模型中创建一个新的方法:
class User extends Model
{
public function getNameAttribute()
{
return $this->forenames . ' ' . $this->surname;
}
}
同 Eloquent 识别 scope 一样,任何以 get 和 Attribute 包裹起来的方法都会当做 Eloquent accesor(访问器)。现在我们可以试着执行下面的代码段,它得到的结果和前面是相同的:
{{ $user->name }}
这不仅可以重复使用,而且更容易输入,并且更具有可读性。
4. 动态方法名称
……缺乏一个很好的术语。Eloquent 对于一些方法特别的聪明,如 where() 。看看下面的例子:
// Post::where('published', 1)->get();
Post::wherePublished(1)->get(); // Post::where('category', null)->get();
Post::whereNull('category')->get(); // Post::where('category', '!=', null)->get();
Post::whereNotNull('category')->get();
是不是更加的整洁?
5. 扩展访问器
我们来扩展一下 #3。有时候,特别是使用 API 时,当我们使用 Eloquent 从数据库获取记录时,需要对返回的结果集中添加一些访问器(或者说属性)。如果没看明白的话,看看下面这个例子。当调用 User::find(1) 的时候,返回的结果看起来可能是下面这样的:
{
id: 1,
forenames: "Terry",
surname: "Harvey",
email: "contact@terryharvey.co.uk",
created_at: "2016-05-02 21:27:58",
updated_at: "2016-05-03 18:09:37",
}
这并没有什么问题,但如果我们想在其中显示前面创建的 name 属性呢?让我们回到模型中添加 $appends 属性:
class User extends Model
{
protected $appends = ['name'];
}
如果再次执行前面的代码,name 属性被直接添加到了结果中。
{
id: 1,
forenames: "Terry",
surname: "Harvey",
name: "Terry Harvey",
email: "contact@terryharvey.co.uk",
created_at: "2016-05-02 21:27:58",
updated_at: "2016-05-03 18:09:37",
5 个 Laravel Eloquent 小技巧的更多相关文章
- 50分钟学会Laravel 50个小技巧
50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45 Yuansir-web菜鸟 原文 http://www.yuansir-web.com/2015/12/09 ...
- 20 个 Laravel Eloquent 必备的实用技巧
Eloquent ORM 看起来是一个简单的机制,但是在底层,有很多半隐藏的函数和鲜为人知的方式来实现更多功能.在这篇文章中,我将演示几个小技巧. 1. 递增和递减 要代替以下实现: $article ...
- 50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)
转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 50分钟学会Laravel 50个小技巧 原文链接:< 50 Laravel Tricks in 50 Mi ...
- laravel获取checkbox值的小技巧
以前老是用三元运算符来判断,现在有了更好的方法: 1.html代码 <input type="hidden" name="approved" value= ...
- 一些实用的 Laravel 小技巧
Laravel 中一些常用的小技巧,说不定你就用上了. 1.侧栏 网站一般都有侧栏,用来显示分类,标签,热门文章,热门评论啥的,但是这些侧栏都是相对独立的模块,如果在每一个引入侧栏的视图中都单独导入与 ...
- 深入理解 Laravel Eloquent(三)——模型间关系(关联)
Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database A ...
- Laravel Eloquent使用小记
原文地址:http://blog.onlywan.cc/14843810761202.html Laravel Eloquent使用小记 今天由于开发数据库业务中间层须要.開始研究Laravel El ...
- PHP开发者该知道的5个Composer小技巧
Composer 是新一代的PHP依赖管理工具.本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便. 1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单 co ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
随机推荐
- 【设计模式】——工厂方法FactoryMethod
前言:[模式总览]——————————by xingoo 模式意图 工厂方法在MVC中应用的很广泛. 工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建 ...
- logstash获取日志,时间戳相差8小时
背景: logstash版本:2.4.9 由于logstash在获取时区的时候,默认获取的是UTC默认时间,同时elasticsearch在创建索引的时候,统一使用UTC时间,因此实际上在创建 ...
- Codeforces Round #528 Div. 1 自闭记
整天自闭. A:有各种讨论方式.我按横坐标排了下然后讨论了下纵坐标单调和不单调两种情况.写了15min也就算了,谁能告诉我printf和cout输出不一样是咋回事啊?又调了10min啊?upd:突然想 ...
- 【题解】 bzoj1207: [HNOI2004]打鼹鼠 (动态规划)
bzoj1207,懒得复制,戳我戳我 Solution: 挺傻逼的一个\(dp\),直接推就好了 这题在bzoj上的数据有点问题,题目保证每个时间点不会出现在同一位置两个地鼠,然而他有= =(还浪费我 ...
- NOIP2018 No regrets youth
NOIP2018在即,20181009总结一些易错的知识点和解题方法 ——by ljc20020730 HGOI NOIP2018 No regrets youth ! NOIP2018 No reg ...
- 【字符串算法2】浅谈Manacher算法
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 字符串算法2:Manacher算法 问题:给出字符串S(限制见后)求出最 ...
- emoji表情与unicode编码互转(JS,JAVA,C#)
1.表情字符转编码 [C#] Encoding.UTF32.GetBytes("
- spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置
spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...
- SQL Server 事务与隔离级别实例讲解
上班途中,你在一处ATM机前停了下来.正当你在敲入密码的时候,你的一位家人也正在镇上的另一处TAM机上输入密码.你打算从某个还有500元余额的账户上转出400元,而你的家人想从同一账户取走300元.倘 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...