Laravel Eloquent 模型 进阶技巧

简介: Laravel Eloquent 模型使用进阶技巧

Laravel Eloquent 模型使用进阶技巧


列名重命名


在 Eloquent Query Builder 中,可以使用 as 重命名列名称进行输出,比如:


$users = DB::table('users')->select('name', 'email as my_email')->get();


Map 查询结果


在 Eloquent 查询之后,可以使用 Collections 中的 map() 函数来修改行。


$users = User::where('role_id', 1)->get()->map(function (User $user) {
    $user->some_column = some_function($user);
    return $user;
});


这里在对比一下 数组array 的map()用法:


$userIds = array_map(function ($value) {
    return ['userid' => $value];
}, $appointmentsUserIds);
返回的数据是
[['userid'=xxxx],['userid'=xxxx],]


根据时间字段快速排序


不建议使用:


User::orderBy('created_at', 'desc')->get();


建议使用下述方法执行效率更快:


User::latest()->get();


默认情况下,latest() 会按 created_at 降序排序。


有一个相反的方法 oldest(),它按 created_at 升序排序:


User::oldest()->get();


可以指定时间字段进行排序


$lastUpdatedUser = User::latest('updated_at')->first();


原始SQL查询


使用类似 whereRaw() 方法的 SQL 原始查询,直接在查询中进行一些特定于数据库的计算,而不是在 Laravel 中,通常结果会更快。


例如,获得注册后 10 天以上仍处于活跃状态的用户,可以使用以下代码:


User::where('active', 1)
->whereRaw('TIMESTAMPDIFF(DAY, created_at, updated_at) > ?', 10)
->get();


多个范围查询


在 Eloquent 中组合和链式查询范围,在查询中使用多个范围。


模型:


public function scopeActive($query) {
    return $query->where('active', 1);
}
public function scopeRegisteredWithinDays($query, $days) {
    return $query->where('created_at', '>=', now()->subDays($days));
}


控制器中使用:


$users = User::registeredWithinDays(10)->active()->get();


无需转换 Carbon


如果使用 whereDate() 查询今日的记录,可以直接使用 Carbon 的 now() 方法,会自动转换为日期进行查询,无需指定 ->toDateString():


// 今日注册的用户
$todayUsers = User::whereDate('created_at', now()->toDateString())->get();
// 无需 toDateString() ,直接 now() 即可
$todayUsers = User::whereDate('created_at', now())->get();


永不更新某个字段


如果有一个数据库字段需要只更新一次,可以使用 Eloquent 的修改器来实现:


class User extends Model
{
    public function setEmailAttribute($value)
    {
        //有值则不设置
        if ($this->email) {
            return;
        }
        $this->attributes['email'] = $value;
    }
}


find () 查询多条数据


find() 不止可以查询一条数据,当传入多个 ID 的值会返回这些结果的集合:


// 返回 Eloquent Model
$user = User::find(1);
// 返回 Eloquent Collection
$users = User::find([1,2,3]);


find () 限制字段


find() 可在查询多条的数据的情况下,指定只返回哪些字段:


// 会返回只包含 first_name 和 email 的 Eloquent 模型
$user = User::find(1, ['first_name', 'email']);
// 会返回只包含 first_name 和 email 两个字段的 Eloquent 集合
$users = User::find([1,2,3], ['first_name', 'email']);


相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2512 5
|
SQL 关系型数据库 MySQL
省市区管理sql数据表设计、以及全国省市区全部最新数据
省市区管理sql数据表设计、以及全国省市区全部最新数据
4508 0
省市区管理sql数据表设计、以及全国省市区全部最新数据
|
11月前
|
NoSQL 应用服务中间件 Linux
解决PHP Warning: Module ‘zip’ already loaded in Unknown on line 0 扩展加载错误的完整方案-其他扩展通用卓伊凡
解决PHP Warning: Module ‘zip’ already loaded in Unknown on line 0 扩展加载错误的完整方案-其他扩展通用卓伊凡
206 0
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2827 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
Java
Java 实现 捕鱼达人 小游戏【附源码】
Java 实现 捕鱼达人 小游戏【附源码】
988 0
|
数据可视化 安全 数据挖掘
streamlit (python构建web)之环境搭建
在微信订阅号中发现了一篇关于Streamlit的文章,激发了我的兴趣。Streamlit是一款专为数据科学家设计的开源Python库,能迅速将数据分析脚本转变为功能完备的Web应用。它简化了开发流程,支持轻松添加交互组件及动态展示图表、图像等,非常适合开发安全扫描工具。Streamlit基于Jupyter Notebook原理,通过Python脚本创建可视化和交互式的Web应用,易于部署分享。安装方法多样,可通过`pip install streamlit`快速安装,或通过Anaconda环境管理依赖。启动示例应用只需运行简单命令,即可体验自带的动画、绘图和数据展示等功能。
1917 1
streamlit (python构建web)之环境搭建
|
JSON 算法 Java
Spring boot框架 JWT实现用户账户密码登录验证
Spring boot框架 JWT实现用户账户密码登录验证
|
SQL 关系型数据库 PHP
深入理解 Laravel 的 ORM:Eloquent
【8月更文挑战第31天】
696 0
|
设计模式 测试技术 数据处理
|
安全 数据管理 PHP
详尽解析:如何在 Laravel 中实现软删除
【8月更文挑战第31天】
675 0