Задать вопрос

Возможна ли в Doctrine 2 связь нескольких таблиц с одной через промежуточную таблицу?

Пытаюсь 2 дня написать аннотации для сущностей, и не могу понять, как это сделать, если это вообще возможно.

Имею в Postgresql следующие таблицы:
Language -> id, iso_code
I18n_Entity -> id
I18n_String -> id, i18n_entity_id, language_id, text
Product -> id, i18n_entity_id(unique)
Category -> id, i18n_entity_id(unique)


Надо создать 2 функции
getProductByName(Language $language, $name);
Если бы я использовал чистый SQL то запрос был бы такой
SELECT p.*, i18s.text
FROM product as p
INNER JOIN I18n_String AS i18s ON i18s.i18n_entity_id = p.i18n_entity_id AND i18s.language_id = :language_id
WHERE i18s.text = :name


getCategoryByName(Language $language, $name);
SELECT c.*, i18s.text
FROM category as c
INNER JOIN I18n_String AS i18s ON i18s.i18n_entity_id = c.i18n_entity_id AND i18s.language_id = :language_id
WHERE i18s.text = :name


Запрос идёт так: product -> i18n_entity -> i18n_string <- language .
Или сокращённо сразу product -> i18n_string <- language.

Используется интернационализация на сайте, и вся соль в том, что слова хранятся в отдельной таблице, c которой связаны несколько таблиц не только product и category.

Собственно возможно ли описать такие связи с помощью Doctrine 2, и если да, то как?
  • Вопрос задан
  • 3151 просмотр
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@boodda Автор вопроса
Ну я так понимаю, чтобы воспользоваться DQL , связь таблиц должна быть определена в аннотациях.
Если использовать в DQL join между Product и I18nString через I18nEntity, которая замаплена на таблицу i18n_entity, то как прописать связь на первичного ключа i18n_entity.id хотя бы в одну сторону на поле i18n_string.entity_id, а если не использовать i18nEntity, то каким образом можно сделать с одного поля i18n_string.entity_id два или более внешних ключа на разные таблицы, так не базе не сделаешь, да и в принципе это как то не верно ?

то есть правильно должно быть так
SELECT p.*, i18s.text
FROM product as p
INNER JOIN i18n_entity AS i18e ON i18e.id = p.i18n_entity_id
INNER JOIN i18n_String AS i18s ON i18s.i18n_entity_id = i18e.id AND i18s.language_id = :language_id
WHERE i18s.text = :name

В DQL это будет что то типа
select p, i18s
FROM \Application\Entity\Product p
JOIN p.i18nEntity i18n
JOIN i18n.id i18s
JOIN i18s.language l
WHERE l.id = :language AND i18s.text = :name

но тогда у меня отсутствует связь JOIN i18n.id i18s
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы