Laravel Translatable包_模型翻译字段管理【介绍】

阿杰同学_5127

阿杰同学_5127

2026-04-30

546人浏览

原创

spatie/laravel-translatable 核心在于明确翻译存储结构、读写机制与事务一致性:翻译存于独立表(如 product_translations),需含 model_id、locale、attribute、value 四字段及唯一索引;读取按 locale→fallback→default 顺序匹配,不合并字段;更新必须用 settranslation() + save() 保证事务安全;关联翻译需显式 withtranslation() 预加载。

laravel translatable包_模型翻译字段管理【介绍】

用 spatie/laravel-translatable 管理模型翻译字段,核心不是“加个 trait 就完事”,而是要明确:翻译数据存在哪、怎么读、怎么写、事务里会不会丢——否则上线后查不到德语内容、保存时漏掉法语、并发更新时覆盖翻译,都是高频事故。

翻译数据默认存在独立表里,不是 JSON 字段

包默认采用「主表 + 翻译表」双表结构,比如 products 对应 product_translations。翻译表必须有 model_id、locale、attribute、value 四个关键字段,且 (model_id, locale, attribute) 应设为唯一索引——否则 upsert 或 save() 时可能静默失败或重复插入。

常见错误现象:

  • 调用 $product->setTranslation('name', 'de', 'Tisch')->save() 后查数据库发现没写入:检查 product_translations 表是否真有这四列,以及是否建了唯一索引
  • 手动在翻译表里插了一条记录,但 $product->translate('de')->name 返回空:确认 locale 值是 'de'(不是 'de_DE'),且 attribute 是小写字符串 'name'

读取翻译时,locale 和 fallback 必须对得上配置

translate($locale) 不是简单查表,它会按顺序尝试:当前 locale → 配置的 locale_fallbacks → 默认 locale(app()->getLocale())。如果中间某一级查到空值,就继续往下找;但只要某一级查到非空,就立刻返回,不会合并。

所以别指望 translate('fr') 自动补上 en 里有的字段而 fr 里没有的字段——它只返回 fr 行里 value 不为空的那些属性。

实操建议:

Laravel Creem Agent
Laravel Creem Agent

Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

下载
  • 在 config/translatable.php 中显式定义 'locale_fallbacks' => ['en' => ['en', 'zh']],避免依赖隐式 fallback
  • 需要“有就用,没有就用默认语言”的语义,用 translateOrDefault('fr'),它会在 fr 找不到时自动 fallback 到默认 locale 的完整翻译对象
  • 调试时直接 dump $product->translations,看 Eloquent 加载进来的到底是哪些 locale 的记录

事务中更新翻译字段,必须走 setTranslation + save,不能单独 save 翻译模型

这是最常踩的坑:在 DB::transaction 里写 $product->translate('es')->name = 'Mesa'; $product->translate('es')->save();,结果事务回滚后只有主表回滚,翻译表已提交。

原因:$product->translate('es') 返回的是一个独立的 Eloquent 模型实例,默认用自己的连接执行 save(),不绑定父事务。

正确做法只有一条路:

  • 所有修改必须通过 setTranslation('field', 'locale', 'value') 写入内存,最后统一调 $product->save()
  • 确保数据库引擎是 InnoDB,且连接配置 'strict' => true,否则事务隔离级别不足会导致部分写入成功
  • 避免在事务中触发模型事件(如 saving),事件回调里再调 translate()->save() 同样会脱钩

关联模型的翻译不会自动预加载,with() 里要显式指定

主模型用了 HasTranslations,关联模型也用了,不代表 with('categories') 会自动带出 categories 的德语名。Eloquent 不知道你要哪门语言,更不会帮你调 translate('de')。

解决方式取决于你用的包版本和场景:

  • 用 spatie/laravel-translatable:在关系定义里加 ->withTranslation('de'),例如 Category::with(['products' => function ($q) { $q->withTranslation('de'); }])
  • 用 astrotomic/laravel-translatable:改用 withTranslation() 方法,语法一致
  • 如果关联太多、语言动态切换,推荐在控制器里统一做一次 load('relationName:*,name,description') 再批量 translate(),比嵌套 with 更可控

真正麻烦的不是语法,而是翻译字段缺失时的静默行为——它不会报错,只是返回空字符串。上线前务必用非默认 locale 实测所有列表页和详情页。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2024.04.09

857

10

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

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

2024.04.09

835

9

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

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

2024.04.09

2468

10

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

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

2024.04.10

3881

7

laravel入门教程
laravel入门教程

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

2025.08.05

5530

22

laravel实战教程
laravel实战教程

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

2025.08.05

3676

13

laravel面试题
laravel面试题

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

2025.08.05

6949

7

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

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

2026.03.04

1416

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

195

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 204人学习

Composer手册
Composer手册

共0课时 | 0人学习