0

0

Laravel模型修改器?修改器如何工作?

幻夢星雲

幻夢星雲

发布时间:2025-09-15 10:47:01

|

843人浏览过

|

来源于php中文网

原创

Laravel模型修改器通过get{属性名}Attribute和set{属性名}Attribute方法,在获取或设置属性时自动处理数据格式转换、加密解密、组合属性等逻辑,避免重复代码并防止无限循环。

laravel模型修改器?修改器如何工作?

Laravel模型修改器,简单来说,就是让你在从数据库获取数据后,或者将数据保存到数据库之前,对模型的属性进行一些“魔法”操作。它就像一个数据变形金刚,可以把数据库里存储的格式转换成你想要的格式,反之亦然。

修改器主要通过两个方法来工作:

get{属性名}Attribute
set{属性名}Attribute
。前者在获取属性值时被调用,后者在设置属性值时被调用。

解决方案

修改器允许你在获取和设置模型属性时自定义逻辑。以下是一些使用场景和例子:

  • 格式化日期: 数据库里存储的是时间戳,但你想在前端展示成 "YYYY-MM-DD" 的格式。

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        public function getCreatedAtAttribute($value)
        {
            return date('Y-m-d', strtotime($value));
        }
    
        public function setCreatedAtAttribute($value)
        {
            $this->attributes['created_at'] = strtotime($value);
        }
    }

    这样,当你访问

    $user->created_at
    时,就会得到格式化后的日期字符串。当你设置
    $user->created_at = '2023-10-27'
    时,会自动转换为时间戳并存储到数据库。

  • 加密/解密数据: 比如用户的银行卡号,需要加密存储,解密后才能使用。

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\Facades\Crypt;
    
    class User extends Model
    {
        public function getBankAccountAttribute($value)
        {
            return Crypt::decryptString($value);
        }
    
        public function setBankAccountAttribute($value)
        {
            $this->attributes['bank_account'] = Crypt::encryptString($value);
        }
    }

    这个例子使用了 Laravel 的

    Crypt
    Facade 来加密和解密数据。

  • 组合属性: 比如数据库里存储了

    first_name
    last_name
    ,你想获取一个
    full_name
    属性。

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        public function getFullNameAttribute()
        {
            return $this->first_name . ' ' . $this->last_name;
        }
    }

    注意,这个例子只有

    get
    方法,没有
    set
    方法,因为
    full_name
    是一个只读属性,不能直接设置。

  • 类型转换: 将数据库中的字符串转换为布尔值,或者将数值转换为字符串。

    瑞志企业建站系统(ASP版)2.2
    瑞志企业建站系统(ASP版)2.2

    支持模板化设计,基于标签调用数据 支持N国语言,并能根据客户端自动识别当前语言 支持扩展现有的分类类型,并可修改当前主要分类的字段 支持静态化和伪静态 会员管理功能,询价、订单、收藏、短消息功能 基于组的管理员权限设置 支持在线新建、修改、删除模板 支持在线管理上传文件 使用最新的CKEditor作为后台可视化编辑器 支持无限级分类及分类的移动、合并、排序 专题管理、自定义模块管理 支持缩略图和图

    下载
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Product extends Model
    {
        public function getIsActiveAttribute($value)
        {
            return (bool) $value;
        }
    
        public function setIsActiveAttribute($value)
        {
            $this->attributes['is_active'] = (int) $value;
        }
    }

    这里,

    is_active
    在数据库中可能是 TINYINT 类型,通过修改器,我们可以在 PHP 代码中将其转换为布尔值,方便使用。

如何避免修改器中的无限循环?

这是个常见的问题。如果你在

get
set
方法中直接访问
$this->属性名
,就会触发无限循环。正确的做法是使用
$this->attributes['属性名']
来访问原始属性值。

例如,错误的做法:

public function getEmailAttribute($value)
{
    return strtolower($this->email); // 错误!无限循环
}

正确的做法:

public function getEmailAttribute($value)
{
    return strtolower($this->attributes['email']); // 正确!
}

修改器和访问器有什么区别?什么时候应该使用它们?

实际上,在 Laravel 中,“修改器” 和 “访问器” 经常被放在一起讨论,甚至可以认为它们是同一个概念的不同方面。

get{属性名}Attribute
通常被称为访问器,
set{属性名}Attribute
被称为修改器。

  • 访问器 (Accessor): 用于在获取属性值时修改属性。
  • 修改器 (Mutator): 用于在设置属性值时修改属性。

什么时候使用它们呢? 当你需要对模型属性进行格式化、转换、加密/解密、组合等操作时,就应该使用修改器和访问器。 它们提供了一种简洁、优雅的方式来处理模型数据,避免在业务逻辑中重复编写相同的代码。

如何在 Eloquent 模型中使用类型转换 (Casting)?它和修改器有什么关系?

Eloquent 模型提供了类型转换 (Casting) 的功能,可以在模型中定义

casts
属性,自动将数据库中的数据转换为指定的数据类型。

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'is_admin' => 'boolean',
        'created_at' => 'datetime:Y-m-d H:i:s',
    ];
}

在这个例子中,

is_admin
字段会被自动转换为布尔值,
created_at
字段会被自动转换为
DateTime
对象,并格式化为指定的字符串格式。

那么,类型转换和修改器有什么关系呢?

  • 类型转换: 主要用于简单的数据类型转换,比如将字符串转换为布尔值、整数、浮点数、日期等。
  • 修改器: 更加灵活,可以执行复杂的逻辑,比如加密/解密、格式化、组合等。

如果只需要进行简单的数据类型转换,可以使用类型转换。如果需要执行复杂的逻辑,或者需要同时修改获取和设置行为,可以使用修改器。在某些情况下,也可以将两者结合使用。例如,可以使用类型转换将数据库中的字符串转换为

DateTime
对象,然后使用修改器对
DateTime
对象进行格式化。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

277

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

371

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

374

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

85

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

65

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

68

2025.08.05

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号