【问题标题】:Complex Query in Doctrine 2教义 2 中的复杂查询
【发布时间】:2011-12-26 14:31:07
【问题描述】:

我有一个多语言数据库(灵感来自here, the 3rd option。)

我的数据库架构如下所示:

 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

我正在使用带有 Doctrine 的 Symfony 2,我需要以某种语言(作为参数传递)的所有文章的报告。

文章有一个特定语言的名称描述参考,但没有'没有(至少不是要求的语言)。

到目前为止,我最好的方法是这个 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
     ;

有没有办法简化查询并使其在 Doctrine 的 DQL 中工作?

亲切的问候,

丹·塞尔瑙

【问题讨论】:

  • 为什么需要这些嵌套连接?如果把括号去掉,把on子句移到正确的位置,结果不一样吗?

标签: sql database symfony1 doctrine


【解决方案1】:

我将尝试在没有子选择(子连接)的情况下编写您的查询: 缩进连接与 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)   

正如我现在所看到的,这是在您的link 中指出的问题的投票最多的答案中显示的模型

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 2012-01-01
    • 1970-01-01
    • 2012-08-07
    • 2012-12-23
    • 1970-01-01
    • 2014-12-27
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多