如何使用Doctrine 2 + Gedmo translable在不同的表中存储翻译


How to store a translation in a different table using Doctrine 2 + Gedmo Translatable

使用https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md#advanced-examples上的指令可以拆分表,以便将翻译存储在另一个表中。生成的表结构为:

(例子)

 Article             ArticleTranslation
+--------------+    +----------------------+
| id           |    | id                   |
+--------------+    +----------------------+
| title        |    | locale               |
+--------------+    +----------------------+
| content      |    | objectclass          |
+--------------+    +----------------------+
| online       |    | foreign_key          |
+--------------+    +----------------------+
                    | field                |
                    +----------------------+

在我看来,使用这种标准方法有两个问题:1. 翻译后的实体存储在翻译表中的多条记录中(每个字段一条)2. 原始记录也应该在翻译后的表中。

Doctrine+ Gedmo translable是否可以像这样存储翻译:

(例子B)

 Article             ArticleTranslation
+--------------+    +----------------------+
| id           |    | id                   |
+--------------+    +----------------------+
| online       |    | foreign_key          |
+--------------+    +----------------------+
                    | locale               |
                    +----------------------+
                    | title                |
                    +----------------------+
                    | content              |
                    +----------------------+

所以未翻译的字段应该在Article表中,翻译后的字段应该在ArticleTranslation表中,每篇翻译后的文章有一条记录。

如何做到这一点?

使用当前的体系结构,它在翻译表中存储每个字段的记录。一般来说,这样做是为了避免在实体中添加或删除可翻译字段时出现同步问题。您的方法的实现将导致有专门用于扩展的额外模式迁移命令,或者在后台有一些神奇的映射。为了避免混淆,唯一计划更新的是原始记录翻译存储作为默认的区域设置回退,而不是在翻译表中有记录。我知道,在高级情况下,这种行为不是你会做的,但这是大多数用户的行为,他们希望它的配置尽可能简单。对于集合转换,你可以使用查询提示。为了保持简单性,这种行为永远不会像SF2那样覆盖99%的用例