20 个 Laravel Eloquent 必备的实用技巧

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); // 增加10Product::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('AppUser');}

也可以添加查询条件和排序:

public function approvedUsers(){    return $this->hasMany('AppUser')->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(AppPost::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('AppAuthor')->withDefault();}

还可以指定默认值:

public function author(){    return $this->belongsTo('AppAuthor')->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();
static::addGlobalScope('order', function (Builder $builder) {    $builder->orderBy('name', 'asc');});

}

13. 原生 SQL 查询方法

Eloquent 支持嵌入原生 SQL 查询:

// whereRaw$orders = DB::table('orders')->whereRaw('price > IF(state = "TX", ?, 100)', [200])->get();

// havingRawProduct::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

// orderByRawUser::where('created_at', '>', '2016-01-01')->orderByRaw('(updated_at - created_at) desc')->get();

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 个 Laravel Eloquent 必备的实用技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1258660.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 05:51:38
下一篇 2025年12月10日 05:51:58

相关推荐

  • PHP怎样处理RSA加密解密 PHP实现RSA加密解密的实战代码

    在php中处理rsa加密解密主要通过openssl扩展实现,具体步骤包括生成密钥对、使用公钥加密数据、使用私钥解密数据。1. 首先确保启用openssl扩展,未启用则修改php.ini并重启服务器;2. 使用php代码生成2048位rsa密钥对,并分别提取公钥和私钥;3. 通过openssl_pub…

    2025年12月10日 好文分享
    000
  • PHP怎样防止SQL注入 PHP防SQL注入的5个关键措施

    防止sql注入的核心方法是使用预处理语句和参数化查询,结合输入验证、输出编码、最小权限原则等措施。1. 使用预处理语句(如pdo或mysqli)将sql结构与数据分离,防止恶意数据被当作sql执行;2. 对所有用户输入进行严格验证,确保其格式、类型和长度符合预期,例如使用intval()或filte…

    2025年12月10日 好文分享
    000
  • PHP如何保存Session值 PHP Session操作的5个技巧

    session过期后数据会丢失,因为默认存储在服务器上并由垃圾回收机制清理;防止session劫持需使用https、设置cookie属性、定期更换session id、验证用户信息、缩短过期时间及使用token;跨域共享session可通过设置cookie域、jsonp、cors、postmessa…

    2025年12月10日 好文分享
    000
  • PHP怎样处理GraphQL请求 GraphQL接口调用的4个步骤详解

    php处理graphql请求的核心流程是接收请求、解析查询、执行并返回结果。graphql接口调用包括4个步骤:1. 构建请求,确定endpoint并构造查询体;2. 使用guzzle等http库发送post请求;3. 处理响应,解析json并捕获错误;4. 展示所需数据。使用guzzle时需先通过…

    2025年12月10日 好文分享
    000
  • PHP中array()和[]定义数组的区别

    php中array()和[]的主要区别在于语法和版本支持。1.array()函数适用于所有php版本,兼容性强;2.[]是php5.4引入的简写语法,更简洁但仅支持php5.4及以上版本;3.两者性能差异可忽略不计,选择应基于代码风格和项目需求;4.为提高可读性和维护性,建议在同一个项目中保持语法一…

    2025年12月10日 好文分享
    000
  • PHP怎样处理GraphQL突变 GraphQL数据变更操作技巧

    graphql突变在php中用于执行创建、更新或删除数据等变更操作。1.定义schema中的突变类型,包括名称、参数和返回值类型;2.实现resolver函数,处理业务逻辑并与突变关联;3.创建脚本接收并解析graphql请求,执行对应resolver;4.注重安全性,如输入验证、身份认证、速率限制…

    2025年12月10日 好文分享
    000
  • PHP如何调用CMake构建 使用PHP执行CMake的3个示例

    php调用cmake构建的核心方式是通过exec()、shell_exec()、system()等函数执行系统命令,但需注意权限控制、参数安全与错误处理。1. 使用exec()或类似函数执行cmake命令进行配置与构建,确保路径正确并创建构建目录;2. 传递参数时使用escapeshellarg()…

    2025年12月10日 好文分享
    000
  • PHP跨域请求:CORS处理指南

    跨域请求问题可通过设置cors头解决,具体步骤如下:1. 在php脚本中添加access-control-allow-origin指定允许的域名或使用*(仅限开发环境);2. 设置access-control-allow-methods定义允许的http方法;3. 配置access-control-…

    2025年12月10日 好文分享
    000
  • PHP中的命令行脚本:如何在PHP中编写命令行工具

    要运行php命令行脚本,需确认安装php cli,创建.php文件并添加shebang行,随后通过php filename.php或赋予执行权限后运行;处理参数可通过$argv和$argc获取,也可使用getopt()或第三方库;打造专业cli工具应支持颜色输出、帮助文档、清晰错误提示及交互输入,并…

    2025年12月10日
    000
  • PHP中的Trait特性:如何使用Trait实现代码复用

    trait是php中用于代码复用的机制,允许在多个类间共享方法实现。它通过trait关键字定义,并使用use引入到类中,例如trait uniqueid { public function generateid() { return uniqid(); }}配合class user { use un…

    2025年12月10日
    000
  • PHP中的索引优化:如何提高数据库查询性能

    索引是提升数据库查询速度的关键。它像书的目录一样,帮助数据库快速定位数据,避免全表扫描。常见类型包括主键索引、唯一索引、普通索引和复合索引。选择合适字段建立索引应优先考虑频繁查询条件、连接字段和排序分组字段;不适合加索引的情况包括重复率高、很少查询或小数据量表的字段。使用复合索引时需遵循最左匹配原则…

    2025年12月10日
    000
  • PHP中的授权管理:如何在PHP中实现用户权限控制

    实现php用户权限控制需四步:1.明确权限结构,通过用户、角色、权限三层次设计,关联表结构清晰管理权限;2.登录后加载权限信息,通过查询角色权限并缓存减少数据库压力;3.前后端结合控制访问,前端优化体验,后端严格判断权限标识;4.根据业务决定是否引入行级权限,如限制仅编辑自己创建内容,确保系统安全与…

    2025年12月10日
    000
  • PHP中的队列系统:如何在PHP中实现任务队列处理

    在php中实现任务队列主要通过消息中间件来完成,常见的选择包括redis、rabbitmq、beanstalkd、amazon sqs和kafka,其中redis和rabbitmq最为常用;队列消费者可通过cli常驻进程或定时任务触发两种方式实现,前者响应快但需注意内存管理,后者实现简单但延迟较高;…

    2025年12月10日
    000
  • 教你在不使用框架的情况下也能写出现代化 PHP 代码

    我为你们准备了一个富有挑战性的事情。接下来你们将以 无 框架的方式开启一个项目之旅。 首先声明, 这篇并非又臭又长的反框架裹脚布文章。也不是推销 非原创 思想 。毕竟, 我们还将在接下来的开发之旅中使用其他框架开发者编写的辅助包。我对这个领域的创新也是持无可非议的态度。 这无关他人,而是关乎己身。作…

    2025年12月10日
    000
  • PHP怎样处理LDAP分页查询 LDAP分页查询技巧高效获取目录数据

    php处理ldap分页查询的核心在于控制每次获取的数据量以避免性能问题。1. 使用ldap_control_paged_result函数配合偏移量和限制参数逐步获取数据。2. 通过ldap_set_option设置ldap_opt_sizelimit和ldap_opt_timelimit限制结果大小…

    2025年12月10日 好文分享
    000
  • PHP怎样解析RSS订阅 PHP解析RSS订阅源详细教程

    解析php中rss订阅的方法主要有simplexml、domdocument和第三方库。1. simplexml适合快速解析简单结构,如标题和链接;2. domdocument功能强大,可处理复杂结构如cdata;3. 第三方库如zend feed提供高级功能但增加依赖。根据需求选择:轻量需求用si…

    2025年12月10日 好文分享
    000
  • PHP中的缓存技术:如何在PHP中使用缓存提高性能

    缓存能有效提升php应用性能,原因有二:一是减少数据库查询压力,二是避免重复计算。常用方式包括页面缓存、数据缓存、opcode缓存和浏览器缓存。实现简单数据缓存的步骤是:1.检查缓存是否存在且未过期;2.若有效则读取返回;3.否则执行原始操作并保存缓存。进阶方案推荐使用redis或memcached…

    2025年12月10日
    000
  • PHP中如何实现数组洗牌?

    在php中实现数组洗牌可以通过shuffle()函数或自定义函数实现。1) 使用fisher-yates算法的customshuffle()函数可以高效且公平地打乱数组。2) groupshuffle()函数可在洗牌时保持某些元素的相对顺序不变。 在PHP中实现数组洗牌其实是一个有趣且实用的操作,通…

    2025年12月10日
    000
  • PHP中的微服务架构:如何在PHP中构建微服务应用

    php可以构建稳定高效的微服务架构,关键在于理解核心理念并合理使用工具。其优势包括成熟框架(如laravel、symfony)、易部署维护及丰富社区资源。拆分服务应按业务功能(如订单、用户、支付服务)、数据边界或团队协作模式进行,初期保持2~5个服务为宜,并避免循环依赖。服务间通信可采用同步调用(r…

    2025年12月10日
    000
  • PHP中的CORS处理:如何解决跨域资源共享问题

    cors是浏览器安全机制,限制不同源间的http请求,php解决跨域需设置响应头并处理options预检。具体步骤包括:1.添加access-control-allow-origin指定允许的源;2.使用access-control-allow-methods设置允许的请求方法;3.通过access…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信