Ответ 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, вы должны заставить его работать.