20个LaravelEloquent小技巧,让你开发效率飞起!
想提升你的 Laravel 开发效率吗?本文为你总结了20个实用的 Laravel Eloquent 技巧,助你写出更简洁、高效的代码。从常用的 `increment()` 和 `findOrFail()` 方法,到 `boot()` 方法修改模型默认行为,再到带条件和排序的关联关系,以及模型常用属性配置,本文由浅入深地讲解了 Eloquent ORM 的各种使用技巧。还包括 `when()` 替代 if-else、全局作用域默认排序、原生 SQL 查询方法等高级用法,助你优化数据库操作,提高开发效率。掌握这些技巧,让你在 Laravel 开发中游刃有余,写出更优雅、更高效的代码!

Eloquent ORM 看似简单,但在底层却隐藏着许多不为人知的技巧和功能。这篇文章将带你了解一些实用的小窍门。
1. 增加与减少字段值
代替传统方式:
$article = Article::find($article_id); $article->read_count++; $article->save();
可以使用更简洁的方法:
$article = Article::find($article_id);
$article->increment('read_count');更多用法示例:
Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // 增加10
Product::find($produce_id)->decrement('stock'); // 减少12. X 方法失败后执行 Y 方法
Eloquent 提供了一些便捷方法来简化操作流程。
实例 1:findOrFail()
代替:
$user = User::find($id);
if (!$user) {
abort(404);
}直接写为:
$user = User::findOrFail($id);
实例 2:firstOrCreate()
代替:
$user = User::where('email', $email)->first();
if (!$user) {
User::create([
'email' => $email
]);
}可以写成:
$user = User::firstOrCreate(['email' => $email]);
3. 模型中的 boot() 方法
在模型中使用 boot() 可以修改默认行为,例如监听事件。
class User extends Model
{
public static function boot()
{
parent::boot();
static::updating(function ($model) {
// 可以在这里记录日志或修改字段值
});
}
}创建时自动设置 UUID 示例:
public static function boot()
{
parent::boot();
self::creating(function ($model) {
$model->uuid = (string)Uuid::generate();
});
}4. 带条件和排序的关联关系
普通关联定义:
public function users()
{
return $this->hasMany('App\User');
}也可以添加查询条件和排序:
public function approvedUsers()
{
return $this->hasMany('App\User')->where('approved', 1)->orderBy('email');
}5. 模型常用属性配置
常见模型属性设置如下:
class User extends Model
{
protected $table = 'users';
protected $fillable = ['email', 'password'];
protected $dates = ['created_at', 'deleted_at'];
protected $appends = ['field1', 'field2'];
}其他可配置项包括:
protected $primaryKey = 'uuid'; // 自定义主键 public $incrementing = false; // 关闭自增 protected $perPage = 25; // 分页数量 const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; // 自定义时间戳字段 public $timestamps = false; // 关闭时间戳
6. 根据多个 ID 查询数据
find() 不仅支持单个 ID 查询,还支持数组传参:
$users = User::find([1, 2, 3]);
7. WhereX 魔术方法
可以将以下代码:
$users = User::where('approved', 1)->get();改写为:
$users = User::whereApproved(1)->get();
也支持时间相关查询:
User::whereDate('created_at', date('Y-m-d'));
User::whereDay('created_at', date('d'));
User::whereMonth('created_at', date('m'));
User::whereYear('created_at', date('Y'));8. 使用关联进行排序
假设我们想根据主题最新帖子进行排序:
定义关联:
public function latestPost()
{
return $this->hasOne(\App\Post::class)->latest();
}控制器中使用:
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');9. 使用 when() 替代 if-else
替代传统的 if-else 写法:
if (request('filter_by') == 'likes') {
$query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
$query->orderBy('created_at', request('ordering_rule', 'desc'));
}使用 when() 更优雅:
$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});10. 默认模型返回
避免访问不存在的关系对象导致错误:
原写法可能报错:
{{ $post->author->name }}优化为返回默认模型:
public function author()
{
return $this->belongsTo('App\Author')->withDefault();
}还可以指定默认值:
public function author()
{
return $this->belongsTo('App\Author')->withDefault([
'name' => 'Guest Author'
]);
}11. 使用访问器进行排序
当使用访问器排序时,不能直接使用 orderBy():
$clients = Client::orderBy('full_name')->get(); // 无效应改为:
$clients = Client::get()->sortBy('full_name'); // 有效注意使用的是 sortBy() 而不是 orderBy()。
12. 全局作用域默认排序
在 boot() 中设置全局作用域实现默认排序:
protected static function boot()
{
parent::boot();
<pre class="brush:php;toolbar:false"><code>static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('name', 'asc');
});</code>}
13. 原生 SQL 查询方法
Eloquent 支持嵌入原生 SQL 查询:
// whereRaw
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();<p>// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();</p><p>// orderByRaw
User::where('created_at', '>', '2016-01-01')
->orderByRaw('(updated_at - created_at) desc')
->get();</p>14. 复制模型记录
使用 replicate() 快速复制数据:
$task = Tasks::find(1); $newTask = $task->replicate(); $newTask->save();
15. chunk() 分块处理大数据
代替一次性加载全部数据:
$users = User::all();
foreach ($users as $user) {
// ...
}使用 chunk() 分批处理:
User::chunk(100, function ($users) {
foreach ($users as $user) {
// ...
}
});16. 创建模型时生成配套文件
Artisan 命令:
php artisan make:model Company -mcr
参数说明:
-m生成迁移文件-c生成控制器-r生成资源控制器
17. save() 时控制 updated_at
可以通过参数阻止自动更新时间戳:
$product = Product::find($id); $product->updated_at = '2019-01-01 10:00:00'; $product->save(['timestamps' => false]);
18. update() 返回受影响行数
update() 方法会返回数据库中受影响的行数:
$result = $products->whereNull('category_id')->update(['category_id' => 2]);此时 $result 就是被更新的数据条数。
19. 混合 and/or 的查询
SQL 查询:
WHERE (gender = 'Male' AND age >= 18) OR (gender = 'Female' AND age >= 65)
对应 Eloquent 写法:
$q->where(function ($query) {
$query->where('gender', 'Male')->where('age', '>=', 18);
})->orWhere(function ($query) {
$query->where('gender', '今天关于《20个LaravelEloquent小技巧,让你开发效率飞起!》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!
JS数组some和every方法傻傻分不清?这篇给你讲明白
- 上一篇
- JS数组some和every方法傻傻分不清?这篇给你讲明白
- 下一篇
- 通灵义码高阶技巧教学,快速提升你的工作效率
-
- 文章 · php教程 | 1小时前 | php csv 大数据量 PhpSpreadsheet Excel导出
- PHP导出Excel教程:PHPExcel与CSV使用详解
- 175浏览 收藏
-
- 文章 · php教程 | 1小时前 |
- PHP数组键值自定义对比技巧
- 265浏览 收藏
-
- 文章 · php教程 | 1小时前 | HLS PHP直播源码 流媒体服务器 Nginx-RTMP 播放配置
- PHP直播源码怎么用\_直播源码配置教程
- 252浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHP中define与const区别解析
- 414浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHPwhile循环详解与使用技巧
- 339浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHP路由参数传递与call_user_func_array用法详解
- 115浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHP循环中数据库查询优化方法
- 374浏览 收藏
-
- 文章 · php教程 | 3小时前 | docker Nginx dockercompose php-fpm PHP多版本
- Docker部署PHP多版本共存教程详解
- 355浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3203次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3416次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3446次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4554次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3824次使用
-
- PHP技术的高薪回报与发展前景
- 2023-10-08 501浏览
-
- 基于 PHP 的商场优惠券系统开发中的常见问题解决方案
- 2023-10-05 501浏览
-
- 如何使用PHP开发简单的在线支付功能
- 2023-09-27 501浏览
-
- PHP消息队列开发指南:实现分布式缓存刷新器
- 2023-09-30 501浏览
-
- 如何在PHP微服务中实现分布式任务分配和调度
- 2023-10-04 501浏览

