将SQL转换为Doctrine 2 QueryBuilder

时间:2017-04-28 05:34:11

标签: symfony doctrine-orm

我需要帮助才能将有效的SQL查询转换为createQueryBuilder。我遇到的问题是我不知道LEFT JOINSELECT的{​​{1}}如何{/ 1}}。

createQueryBuilder

我在下面有两个问题,我希望用户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

1 个答案:

答案 0 :(得分:0)

这是一个非常复杂的查询,因为ORM QueryBuilder比数据库更接近您的实体,我不确定您是否可以将DQL“转储”到->join()。有效DBAL QueryBuilder的好消息:

$dbalQueryBuilder
    ->from('user_table as u')
    ...
    ->join('u', '('.$otherDbalQueryBuilder->getSQL().')', 'c')

这是来自记忆所以它可能有点不同,但是类似的东西。

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

$userWithContacts = $entityManager->createNativeQuery(
    $dbalQueryBuilder->getSQL(),
    $yourResultSetMapping
);

我知道这将需要更多的代码,并且可能不如使用ORM QueryBuilder那么好,但我发现它通常是处理需要以某种方式移植到ORM的现有查询的最佳方式。