27

「ext_translations」テーブルにすべての翻訳を含むテーブルがあります。

翻訳はうまく機能します。問題は次のとおりです。sonata-admin バンドルを介してこれらの翻訳を管理したいのです。

ドキュメント、sonata admin で作業教義拡張を取得する方法を既に見つけました。しかし、私の場合、すべての翻訳に対して1 つのテーブル/エンティティがあります (複数のエンティティに対して)。

したがって、このドキュメントによると: http://www.elao.com/blog/symfony-2/doctrine-2/how-to-manage-translations-for-your-object-using-sonataadminbundle.html属性 (下記参照)?

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;

ここで問題を理解している限り、「私は複合キー (objectclass (エンティティ) + name (属性) +foreignKey (エンティティの ID)) を持っているので、'mappedBy' はこれをどのように参照すればよいでしょうか?

翻訳可能なエンティティごとに追加のクラスを作成したくありません (上記のチュートリアルのように)

4

1 に答える 1

2

あなたの状況は非常に複雑です。おそらく、注釈を使用せず、リポジトリ クラスをオーバーライドし、独自のロジックをすべて構築するのが最善の方法です。

Feras がコメントで述べたように、主キーとして複合複合キーを作成する Doctrine 2.1 以降の新しい機能を活用することができます。

Doctrine 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 つのエンティティしか考慮されないため、ニーズに合わせて調整する必要があります。次の手順に従います。

  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 エンティティのコード、翻訳の MappedBy で、次を使用するだけです。

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

そして、これとおそらく少しの調整で、それが機能するはずです。

于 2014-02-03T12:44:39.973 に答える