【问题标题】:Symfony2, Doctrine DQL, Subquery, get values from another table using a conditionSymfony2,Doctrine DQL,子查询,使用条件从另一个表中获取值
【发布时间】:2012-02-06 07:16:37
【问题描述】:

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

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

为了从翻译表中获得正确的翻译行,我在 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();

这个查询可以完成工作,但我担心性能,是否有更好的查询来执行此操作?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    首先,我需要澄清一点。 您的问题中存在真正错误。 您正在使用 ORM,对吗?但你说的是桌子。 ORM 并不关心您的表是如何组织或链接在一起的。它只关心对象本身之间的关系。

    但是,如果您担心性能问题,最好的办法是发送至EXPLAIN 它,就像处理任何 SQL 查询一样。

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

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

    根据您的结果,您可能需要使用另一种策略来获取您的翻译或用原生 SQL 重写您的查询以提供更大的灵活性。

    【讨论】:

    • @Bart,那又怎样?如果您使用 ORM 方法,则不必担心“表”或“数据库”,这个词汇表与 ORM 无关,ORM 的主要目的是抽象持久层并提供对象映射,它可能来自关系数据库、xml 文档、NoSQL 服务器等。您不能使用 50% 关系/50% 对象的混合解决方案,您必须在其中一个或其他之间进行选择。要么使用原生 SQL 查询,要么考虑对象之间的关系,而不是它们在持久层中的表示方式。
    • 随便。您可以称它们为“表”(数据库术语)或“集合”或任何您喜欢的名称,但它们之间的关系将保持不变,在本例中为一对​​多关系。然而,我不同意 SQL 与 ORM 的严格分离。您更改底层系统多少次?大多数情况下从来没有。在访问属性等方面,使用 ORM 通常更方便,但是,编写(本机)SQL 查询有时可以将软件中原本较慢的部分的性能提高几个数量级。最终用户不会关心它是否是 ORM/SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多