【问题标题】:Can Doctrine Join itselfDoctrine 可以加入自身吗
【发布时间】:2014-11-20 01:28:30
【问题描述】:

作为described in a related question,我有一个ViewVersion 实体,其中包含给定View 的多个版本。如果我想根据最后修改的版本获取“最佳”viewVersions 列表,您可以执行GROUP BY viewId,因为您无法控制这些返回的顺序(例如 timeMod DESC )。因此,经过几天的搜索,我相信最好的方法是通过一个简单的 INNER JOIN 来匹配最高 timeMod。

这在 MySQL 中非常有效,但是在 Doctrine 中你怎么能做到呢?

原生 MySQL 查询

SELECT view_version.* 
FROM view_version
#inner join only returns where the result sets overlap, i.e. the one record with highest timeMod
INNER JOIN (
    SELECT MAX(timeMod) maxTimeMod, viewId
    FROM view_version
    GROUP BY viewId
) version ON version.viewId = view_version.viewId AND view_version.timeMod = version.maxTimeMod
#join other tables for filter, etc
INNER JOIN view ON view.id = view_version.viewId
INNER JOIN content_type ON content_type.id = view.contentTypeId
WHERE view_version.siteId=1
AND view.contentTypeId IN (2)
ORDER BY view_version.title ASC

问题

如何使用 QueryBuilder 或 DQL(或者如果绝对必要的话 Native)形成一个 Doctrine 查询以将一个实体加入到它自己。

每次我尝试时,INNER JOIN 都会像这样抱怨 SELECT 语句:

QueryException: [Semantical Error] line 0, col 72 near '(SELECT': Error: Class '(' is not defined

注意:这与我最初的问题不同,因为它专门针对将实体与自身连接起来。

【问题讨论】:

    标签: mysql symfony doctrine-orm doctrine


    【解决方案1】:

    要回答具体提出的问题,您可以轻松地将任何实体连接到自身(即使它没有自引用关联),只需连接到实体快捷方式名称(而不是像正常的关联字段名称) .

    $viewVersionRepo = $em->getRepository('GutensiteCmsBundle:View\ViewVersion');   
    $queryBuilder    = $viewVersionRepo->createQueryBuilder('e')   
    
        // JOIN ENTITY TO ITSELF - VIA BUNDLE SHORTCUT NAME
        ->join('GutensiteCmsBundle:View\ViewVersion', 'version', 'WITH', 'e.viewId = version.viewId')
    
        // JOIN OTHER ASSOCIATED ENTITIES - VIA FIELD NAME
        ->join('e.view', 'view')
        ->addSelect('view')
        ->join('view.contentType', 'contentType')
        ->addSelect('contentType')
    
        // PERFORM RANDOM FILTERS
        ->andWhere('e.siteId = :siteId')->setParameter('siteId', 1)
        ->addOrderBy('e.title', 'ASC');
    
    $query      = $queryBuilder->getQuery();
    $results    = $query->getResult();
    

    然而,这 完成与问题中的查询相同的事情。它不是从 select 语句中加入临时表,这是在这种情况下需要的(以及引用的另一个问题)。这里没有 MAX 列连接,因为您不能 GROUP 连接。您可以通过 JOINED 表中的列对主查询进行 GROUP,但这不允许您对 JOIN 的 ON/WITH 部分执行 MAX。

    但希望这个答案至少对任何想知道如何将实体加入自身或任何随机实体的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 2012-11-15
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多