2013-10-27 26 views
26

我在「ext_translations」表中包含所有翻譯的表格。具有可翻譯字段的SonataAdminBundle(原則擴展名)

翻譯的作品很棒。現在的問題是:我想通過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 |    | 
+--------------+--------------+------+-----+---------+----------------+ 

的mappedBy:

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

據我理解這裏的問題:「我有一個複合鍵(對象類(實體)+名(屬性)+ foreignKey(實體的ID)),那麼'mappedBy'應該如何引用這個?

我不想爲每個可翻譯的實體創建一個額外的類(就像上面的教程)

+0

我不熟悉的SonataAdminBundle,但總體而言學說有什麼問題了「用例1」:http://docs.doctrine-project.org/en/latest/tutorials/composite-primary-keys .html 在這種情況下,Doctrine將處理關係並返回對象的正確翻譯? – Feras

回答

1

您的情況相當複雜。也許最好的可能是如果你不使用任何加法,並建立你自己的邏輯。

Feras在他的評論中說,我們可以嘗試利用新的能力,因爲Doctrine 2.1創建複合複合鍵作爲主鍵。

Doctrine 2原生支持複合主鍵。複合鍵 是一個非常強大的關係數據庫概念,我們十分小心 以確保Doctrine 2支持儘可能多的複合主鍵 用例。對於Doctrine 2.0原始數據類型的組合鍵,支持 ,對於Doctrine 2.1甚至外鍵作爲主鍵支持 。

在文檔中,我們有一個很好的例子,一個用例是或多或少與你相似:實體的

動態屬性(例如文章)。每條 都有許多屬性,主鍵爲「article_id」,屬性名稱爲 。

您可以在這裏看到的例子: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. 而現在,檔案實體的代碼,在翻譯的的mappedBy,你只需使用:

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

而且,這可能是一個litle tunning,你應該讓它工作。

+0

看起來像一個很好的一步一步的解決方案。我做了第1步和第2步,但在步驟3中我感到有點困惑,因爲我正在使用GedmoTranslatable(https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md)。我沒有像$ translations這樣的屬性,我有一個像我想翻譯的屬性(例如名稱),然後用@Gedmo \ Translatable標註。在我的ext_translations中,名爲'field'的字段標識了這一點。所以我在ext_translations中有這樣一行:object_class ='Profile',field ='name'。 – eav

+0

是的,我明白了,但我用翻譯,因爲你是在你的問題中提到的,也是它在示例中在配置文件類中的含義。如果你正在關注你所鏈接的教程,你應該有一個翻譯屬性,它由Gedmo或Doctrine填充。我不知道Gedmo是如何工作的,但是像這樣,你的場景應該與示例中的場景相同,所以你將能夠計算出它 –

+0

我今天再次看一看 - 你會得到你的賞金;-) – eav