Подтвердить что ты не робот

SonataAdminBundle с переводимыми полями (расширения доктрины)

У меня есть таблица со всеми переводами в таблице "ext_translations".

Перевод отлично работает. Проблема в том, что я хочу управлять этими переводами через пакет sonata-admin.

Я уже нашел документацию, как получить рабочие доктрины с помощью 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;

Насколько я понял проблему здесь: "У меня есть составной ключ (objectclass (сущность) + имя (атрибута) + foreignKey (идентификатор сущности)), так как должен" mappedBy "ссылаться на это

Я не хочу создавать дополнительный класс для каждого переводного объекта (например, в учебнике выше)

4b9b3361

Ответ 1

Ваша ситуация довольно сложная. Вероятно, лучшим может быть, если вы не используете какую-либо анотацию, переопределить класс репозитория и построить всю свою собственную логику.

Мы можем попытаться использовать новую способность с 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

Но поскольку этот подход рассматривает только одну сущность, мы должны адаптировать ее к вашим потребностям. Мы можем выполнить следующие шаги:

  • Создайте вид вида вашей таблицы ext_translations

    CREATE VIEW profile_ext_translations
    AS 
    SELECT * 
    FROM ext_translations
    WHERE  object_class = 'Profile'
    
  • Затем создайте разные сущности для этих представлений, т.е. у вас будет объект 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
    
    
    }
    
  • И теперь, код объекта Profile, в mappedBy переводов, вы просто используете:

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

И с этим и, возможно, с настройкой litle, вы должны заставить его работать.