0

0

如何将 Laravel 模型中追加的属性正确转换为数组

聖光之護

聖光之護

发布时间:2026-03-07 17:30:01

|

960人浏览过

|

来源于php中文网

原创

如何将 Laravel 模型中追加的属性正确转换为数组

本文详解在 Laravel 中将带有 $appends 属性的 Eloquent 模型安全、高效地转为数组的方法,重点纠正 refresh()->toArray() 的误用,阐明何时需刷新模型、何时可直接序列化,并提供最佳实践与注意事项。

本文详解在 laravel 中将带有 `$appends` 属性的 eloquent 模型安全、高效地转为数组的方法,重点纠正 `refresh()->toarray()` 的误用,阐明何时需刷新模型、何时可直接序列化,并提供最佳实践与注意事项。

在 Laravel 开发中,常通过模型的 $appends 属性动态添加访问器(Accessors)字段(如 full_name、is_active_label 等),使其在序列化时自动包含在 JSON 或数组输出中。但开发者有时会误以为必须调用 refresh() 才能确保这些追加字段被正确计算并包含——这不仅不必要,还可能引入性能隐患与逻辑错误。

例如,以下代码存在典型误区:

$ticket = Ticket::create([
    'assigned_user_id' => $request->assigned_user_id,
    'creator_id' => $request->creator_id,
    'description' => $request->description,
    'type' => $request->type,
    'status' => Ticket::CREATED,
]);

// ❌ 错误:无必要 refresh,且可能覆盖刚创建的内存状态
$data = $ticket->refresh()->toArray();

refresh() 会重新从数据库查询整条记录,丢弃当前模型实例中所有未持久化的内存状态(包括刚设置但尚未保存的关联、临时属性或访问器依赖的上下文)。而 $appends 字段由访问器(如 getFullNameAttribute())实时计算,只要模型属性已加载(create() 后所有填充值均已存在于内存),直接调用 toArray() 即可完整包含追加字段。

✅ 正确写法如下:

$ticket = Ticket::create([
    'assigned_user_id' => $request->assigned_user_id,
    'creator_id' => $request->creator_id,
    'description' => $request->description,
    'type' => $request->type,
    'status' => Ticket::CREATED,
]);

// ✅ 直接 toArray() —— 访问器自动执行,$appends 字段自然包含
$data = $ticket->toArray();

flash(__('tickets.ticket_created_successfully'))->success();
return $data;

⚠️ 注意事项:

Texta
Texta

AI博客和文章一键生成

下载
  • 仅当数据库状态与内存不一致时才需 refresh():例如并发更新后需同步最新值,或执行了原生 SQL 修改但未更新模型。

  • 确保访问器定义正确:在 Ticket 模型中,$appends 必须声明字段名,且对应 get{Foo}Attribute() 方法存在并返回预期值:

    protected $appends = ['formatted_status'];
    
    public function getFormattedStatusAttribute()
    {
        return match($this->status) {
            Ticket::CREATED => __('ticket.status.created'),
            Ticket::PROCESSING => __('ticket.status.processing'),
            default => __('ticket.status.unknown'),
        };
    }
  • 避免 N+1 问题:若访问器中涉及关系查询(如 $this->user->name),请预先使用 with() 加载关联,否则 toArray() 可能触发额外查询。

  • 调试技巧:可通过 dd($ticket->getAttributes(), $ticket->getAppends()) 快速验证原始属性与追加字段是否就绪。

总结:Laravel 的 toArray() 是智能序列化方法,自动识别 $casts、$hidden、$visible 和 $appends,无需冗余刷新。精简代码、提升性能、保障数据一致性,关键在于理解模型生命周期与序列化机制——让每一行代码都服务于明确意图。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

339

2024.04.09

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

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

291

2024.04.09

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

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

728

2024.04.09

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

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

384

2024.04.10

laravel入门教程
laravel入门教程

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

135

2025.08.05

laravel实战教程
laravel实战教程

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

85

2025.08.05

laravel面试题
laravel面试题

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

76

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

186

2026.03.04

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号