当前位置:首页 > 文章列表 > 文章 > php教程 > 20个LaravelEloquent小技巧,让你开发效率飞起!

20个LaravelEloquent小技巧,让你开发效率飞起!

2025-06-13 20:00:14 0浏览 收藏

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

20 个 Laravel Eloquent 必备的实用技巧

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'); // 减少1

2. 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-&gt;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方法傻傻分不清?这篇给你讲明白
上一篇
JS数组some和every方法傻傻分不清?这篇给你讲明白
通灵义码高阶技巧教学,快速提升你的工作效率
下一篇
通灵义码高阶技巧教学,快速提升你的工作效率
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新
    赛林匹克平台(Challympics)
    探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
    37次使用
  • SEO  笔格AIPPT:AI智能PPT制作,免费生成,高效演示
    笔格AIPPT
    SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
    44次使用
  • 稿定PPT:在线AI演示设计,高效PPT制作工具
    稿定PPT
    告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
    40次使用
  • Suno苏诺中文版:AI音乐创作平台,人人都是音乐家
    Suno苏诺中文版
    探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
    43次使用
  • PicDoc:AI文本转视觉图表,告别枯燥文字,一键生成PPT图例
    PicDoc
    PicDoc,AI驱动的文本转视觉平台,轻松将文字转化为专业图表、思维导图、PPT图例。免费试用,无需下载,提升职场汇报、教学资料、文章配图等场景的表达力。
    43次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码