Сложный запрос в Учении 2 - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть многоязычная база данных (на основе здесь, 3-й вариант .)

Моя схема базы данных выглядит следующим образом:

 Article:          (id, fk_name, fk_description, fk_reference, fk_um)
 Translation:      (id)
 TranslationText:  (id, fk_translation, fk_language,text)
 Language          (id, name)     

 Article --(M:1)--> Translation --(1:M)--> TranslationText --(M:1)--> Language

Я использую Symfony 2 с Doctrine, и мне нужен отчет для всех статей на определенном языке (передается как параметр).

Проблема возникает, когда Статья имеет Имя , Описание или Ссылка на определенном языке, но не имеет Ум (по крайней мере, не на требуемом языке).

Мой лучший подход на данный момент - это SQL, который я не могу реализовать в Doctrine 2 из-за отсутствия вложенных соединений. ( language_id = 28 )

 select ing.*
    , tx_name.text, tx_description.text, tx_reference.text, tx_um.text
 from Article ing 
 left join (Translation t_name left
           join TranslationText tx_name
             on t_name.id = tx_name.fk_translation
             and tx_name.fk_language = 28)
        on ing.fk_name = t_name.id 
 left join (Translation t_description
           left join TranslationText tx_description
             on t_description.id = tx_description.fk_translation
             and tx_description.fk_language = 28)
        on ing.fk_description = t_description.id
 left join (Translation t_reference
           left join TranslationText tx_reference
             on t_reference.id = tx_reference.fk_translation
             and tx_reference.fk_language = 28)
        on ing.fk_reference = t_reference.id
 left join (Translation t_um
           left join TranslationText tx_um
             on t_um.id = tx_um.fk_translation
             and tx_um.fk_language = 28)
         on ing.fk_um = t_um.id
     ;

Есть ли способ упростить запрос и заставить его работать в DQL Doctrine?

С уважением,

Дан Кернау

1 Ответ

1 голос
/ 31 декабря 2011

Я постараюсь написать ваш запрос без подвыборов (вложений): Соединение с отступом находится на том же уровне dbms p.o.v, но для нас оно зависит от предыдущих таблиц.

select ing.*
    , tx_name.text 
    , tx_description.text
    , tx_reference.text
    , tx_um.text
from Article ing 
  left join Translation t_name on ing.fk_name = t_name.id 
     left join TranslationText tx_name
             on (t_name.id = tx_name.fk_translation
             and tx_name.fk_language = 28)
  left join Translation t_description on ing.fk_description = t_description.id
     left join TranslationText tx_description
             on (t_description.id = tx_description.fk_translation
             and tx_description.fk_language = 28)
  left join Translation translation_reference on ing.fk_reference = translation_reference.id
     left join TranslationText tx_reference
             on (translation_reference.id = tx_reference.fk_translation
             and tx_reference.fk_language = 28)
  left join Translation translation_um on ing.fk_um = translation_um.id
     left join TranslationText tx_um
             on (translation_um.id = tx_um.fk_translation
             and tx_um.fk_language = 28);

Кроме того, я думаю, что ваша модель чрезмерно нормализована. Для меня это лучше:

Article:          (id, another_columns)
TranslationText:  (fk_article_id, fk_language,name_text, description_text, reference_text, um_text)
Language          (id, name)   

Как я сейчас вижу, эту модель указывают в наиболее проголосовавшем ответе на вопрос, указанный в вашей ссылке

...