带有可翻译字段的SonataAdminBundle(学说扩展)

eav*_*eav 27 php symfony doctrine-orm sonata-admin

我在"ext_translations"表中有一个包含所有翻译的表.

翻译工作很棒.现在的问题是:我想通过sonata-admin包管理这些翻译.

我已经找到了一个文档,如何使用sonata admin获取工作原理扩展.但在我的情况下,我有一个表/实体用于我的所有翻译(对于多个实体).

所以根据这个文档:http://www.elao.com/blog/symfony-2/doctrine-2/how-to-manage-translations-for-your-object-using-sonataadminbundle.html应该是我的mappedBy属性(见下文)?

ext_translations表:

mysql> show columns from ext_translations;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| locale       | varchar(8)   | NO   | MUL | NULL    |                |
| object_class | varchar(255) | NO   |     | NULL    |                |
| field        | varchar(32)  | NO   |     | NULL    |                |
| foreign_key  | varchar(64)  | NO   |     | NULL    |                |
| content      | longtext     | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

的mappedBy:

   /**
     * @ORM\OneToMany(targetEntity="ProfileTranslation", mappedBy="object", cascade={"persist", "remove"})
     */
    protected $translations;
Run Code Online (Sandbox Code Playgroud)

据我所知这里的问题:"我有一个复合键(对象类(实体)+名称(属性)+ foreignKey(实体的id)),那么'mappedBy'应该如何引用它?

我不想为每个可翻译实体创建一个额外的类(如上面的教程中所示)

Car*_*les 2

你的情况相当复杂。如果您不使用任何注释,覆盖存储库类并构建所有您自己的逻辑,可能最好的可能是。

\n\n

正如 Feras 在评论中所说,我们可以尝试利用 Doctrine 2.1 以来创建复合复合键作为主键的新功能。

\n\n
\n

Doctrine 2 本身支持复合主键。复合键是一个非常强大的关系数据库概念,我们非常小心地确保 Doctrine 2 支持尽可能多的复合主键用例。对于 Doctrine 2.0,支持原始数据类型的复合键;对于 Doctrine 2.1,甚至支持外键作为主键。

\n
\n\n

在文档中,我们有一个很好的用例示例,与您的用例或多或少相似:

\n\n
\n

实体的动态属性(例如文章)。每篇文章都有许多属性,主键为 \xe2\x80\x9carticle_id\xe2\x80\x9d 和 \n \xe2\x80\x9cattribute_name\xe2\x80\x9d。

\n
\n\n

您可以在此处查看示例:http://docs.doctrine-project.org/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes

\n\n

但由于该方法仅考虑一个实体,因此我们必须根据您的需求进行调整。我们可以按照以下步骤操作:

\n\n
    \n
  1. ext_translations创建表格的某种视图

    \n\n
    CREATE VIEW profile_ext_translations\nAS \nSELECT * \nFROM ext_translations\nWHERE  object_class = \'Profile\'\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 然后为该视图创建不同的实体,因此您将拥有一个ProfileExtTranslations具有复合主键的实体,如下所示:

    \n\n
    **\n* @Entity\n*/\nclass ProfileExtTranslations\n{\n\n  /**\n  * @ORM\\ManyToOne(targetEntity="Profile", inversedBy="translations")   \n  * @ORM\\JoinColumn(name="foreign_key", referencedColumnName="id", onDelete="CASCADE")*/\n   private $profile;\n\n /** @Id @Column(type="string") */\n private $field;\n\n //Other fields and methods\n\n\n}\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 现在,在翻译的mappedBy 中,Profile 实体的代码,您只需使用:

    \n\n
    /**\n* @ORM\\OneToMany(targetEntity="ProfileExtTranslation", mappedBy="profile", cascade={"persist", "remove"})\n*/\nprotected $translations;\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
\n\n

有了这个,可能还需要稍微调整一下,你应该可以让它工作了。

\n