首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQL转换为Doctrin2 QueryBuilder

将SQL转换为Doctrin2 QueryBuilder
EN

Stack Overflow用户
提问于 2017-04-28 13:34:11
回答 1查看 1.7K关注 0票数 0

我需要帮助来转换一个有效的SQL查询为createQueryBuilder。我的问题是我不知道如何在createQueryBuilder中的SELECT上使用LEFT JOIN

代码语言:javascript
复制
SELECT username, count(c.user_owner_id) as num_contact, a_g.name as 
       group_name 
       FROM `oro_user` as u 
       INNER JOIN `oro_user_access_group` as u_g on u.id=u_g.user_id    
       INNER JOIN `oro_access_group` as a_g on u_g.group_id=a_g.id 
       LEFT JOIN
      (SELECT cc.user_owner_id 
              FROM `orocrm_contact` as cc 
              INNER JOIN`orocrm_contact_to_contact_grp` as cc_g on cc_g.contact_id=cc.id 
              INNER JOIN `orocrm_contact_group` 
                    as c_g on cc_g.contact_group_id=c_g.id  
              WHERE  c_g.label='New One' and cc.semester_contacted='2017A') 
      as c on u.id=c.user_owner_id 
      WHERE a_g.name='Full-timer' and u.enabled = 1 and u.gender='male' 
      GROUP BY u.id 
      ORDER BY num_contact

我有两个问题下面,我希望用户从联系人LEFT JOIN的结果

代码语言:javascript
复制
 $user = $this->em->getRepository('OroUserBundle:User')->createQueryBuilder('u')
        ->select('u.username')
        ->innerJoin('u.groups','g')
        ->andWhere('g.name = :group')
        ->setParameter('group', 'Full-timer')
        ->getQuery();

 $contacts = $this->em->getRepository('OroContactBundle:Contact')->createQueryBuilder('c')
        ->select('c')
        ->innerJoin('c.groups','g')
        ->andWhere('g.label = :group')
        ->andWhere('c.semester_contacted = :sem')
        ->setParameter('group', 'New One')
        ->setParameter('sem', '2017A')
        ->setMaxResults(1)
        ->getQuery();
EN

回答 1

Stack Overflow用户

发布于 2017-04-28 14:33:25

这是一个相当复杂的查询,由于ORM更靠近实体而不是数据库,我不确定您是否可以直接将QueryBuilder“转储”到->join()中。关于工作的DBAL QueryBuilder,好消息是:

代码语言:javascript
复制
$dbalQueryBuilder
    ->from('user_table as u')
    ...
    ->join('u', '('.$otherDbalQueryBuilder->getSQL().')', 'c')

这是从记忆中得到的,所以它可能有一点不同,但是类似的东西。

这样,您就可以获得所需的所有字段,但不会获得任何实体。幸运的是Doctrine provides ways to build entities from Native SQL using ResultSetMapping

代码语言:javascript
复制
$userWithContacts = $entityManager->createNativeQuery(
    $dbalQueryBuilder->getSQL(),
    $yourResultSetMapping
);

我知道这需要更多的代码,可能没有仅仅使用ORM QueryBuilder那么好,但我发现它往往是处理现有查询的最好方法,这些查询需要以某种方式移植到ORM。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43672667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档