奏鸣曲管理员具有可翻译字段的捆绑包(学说扩展)

2022-08-30 16:12:57

我有一个表格,其中包含“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    |                |
+--------------+--------------+------+-----+---------+----------------+

映射依据:

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

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

我不想为每个可翻译的实体创建一个额外的类(就像上面的教程一样)


答案 1

您的情况非常复杂。最好的办法可能是不使用任何注释,重写存储库类,并构建自己的所有逻辑。

我们可以尝试利用自学说2.1以来的新能力,即创建复合复合键作为主键,正如Feras在他的评论中所说的那样。

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

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

实体的动态属性(例如文章)。每篇文章都有许多属性,主键为“article_id”和“attribute_name”。

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

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

  1. 创建表的某种视图ext_translations

    CREATE VIEW profile_ext_translations
    AS 
    SELECT * 
    FROM ext_translations
    WHERE  object_class = 'Profile'
    
  2. 然后为该视图创建不同的实体,即您将拥有一个具有复合主键的实体,如下所示:ProfileExtTranslations

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

    /**
    * @ORM\OneToMany(targetEntity="ProfileExtTranslation", mappedBy="profile", cascade={"persist", "remove"})
    */
    protected $translations;
    

有了这个,可能还有一点点调谐,你应该让它工作。


答案 2

推荐