Symfony2,Doctrine DQL,Subquery,使用条件从另一个表中获取值

时间:2012-02-06 07:16:38

标签: symfony doctrine-orm

据我所知,doctrine dql不允许在连接中使用子查询。

我有一张桌子和一张trasnlation表。这种关系是一对多的。一条记录有很多翻译。

为了从translatiosn表中获得正确的翻译行,我在select子句中进行了子选择:

        $query = $this->getDoctrine()->getEntityManager()
            ->createQuery('
                SELECT w.id, w.pastid, w.name, w.jsonParameters as params, m.id as milestone_id, m.name as milestone_name,
                m.slug as milestone_slug, m.startdate as milestone_start, m.enddate as milestone_end, 
                w.expand as expand, w.backgroundcolor as background, w.colorschema as colorschema, w.headline as headline, w.subheadline as subheadline, w.text as text, w.expandheight as expandheight,  
                w.url as url, w.created as created, w.updated as updated, wt.name as wtname, ws.weight as width, ws.height as height
                , (SELECT t.headline FROM AdminBundle:widgetTranslation t WHERE t.widget = w.id and t.locale = :published) AS headline_trans
                , (SELECT t2.subheadline FROM AdminBundle:widgetTranslation t2 WHERE t2.widget = w.id and t2.locale = :published) AS subheadline_trans
                , (SELECT t3.text FROM AdminBundle:widgetTranslation t3 WHERE t3.widget = w.id and t3.locale = :published) AS text_trans
                FROM AdminBundle:Widget w
                JOIN w.milestone m
                JOIN w.widgetType wt
                JOIN w.widgetShape ws
                WHERE w.published = 1
                ORDER BY m.order, w.order
            ')->setParameter('published', $currentLocale);

        $result = $query->getArrayResult();

这个查询完成了这个工作,但我担心性能,有没有更好的查询来做到这一点?

1 个答案:

答案 0 :(得分:-1)

首先,我需要澄清一点。 你的问题中有一些真的错误。 你正在使用ORM,对吧?但你在谈论桌子。 ORM不关心表的组织方式或链接方式。它只关注对象本身之间的关系。

但是,如果您担心性能问题,那么最好的办法就是EXPLAIN。{/ p>

由于您使用的是Symfony 2.0,因此您可以使用分析器(在dev env中访问)查看查询的EXPLAIN结果。

确保使用索引,并且要查找的行数不会太高。

根据您的结果,您可能需要使用其他策略来获取翻译或在本机SQL中重写您的查询以提供更大的灵活性。