Php symfony createQueryBuilder Sql查询

Php symfony createQueryBuilder Sql查询,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我有表实体-开发者和用户。在《用户》中,我有三个角色:开发者、自由职业者和公司。所有角色每个开始用户,如果这是用户中的开发人员,则有多个开发人员。在开发人员中,如果公司中有开发人员(角色开发人员),那么他的团队中就有开发人员,如果没有团队,这就是开发人员单身,并且有角色自由职业者。每个团队都有经理,这个经理是实体用户,实体用户中有团队。user.team.id=developer.team.id-此经理的所有开发人员。我需要所有开发人员谁有这个技能阵列,而不是有这个一些标签。如果这是角色开发者,

我有表实体-开发者和用户。在《用户》中,我有三个角色:开发者、自由职业者和公司。所有角色每个开始用户,如果这是用户中的开发人员,则有多个开发人员。在开发人员中,如果公司中有开发人员(角色开发人员),那么他的团队中就有开发人员,如果没有团队,这就是开发人员单身,并且有角色自由职业者。每个团队都有经理,这个经理是实体用户,实体用户中有团队。user.team.id=developer.team.id-此经理的所有开发人员。我需要所有开发人员谁有这个技能阵列,而不是有这个一些标签。如果这是角色开发者,我需要找到他的经理,如果不是,就是这样。我尝试使用sql,但我需要的是使用createQueryBuilder 如何创建$db=$this->getEntityManager()->createQueryBuilder();这个问题? sql查询:

    SELECT u.email , if(u.role='ROLE_DEVELOPER', m.email, u.email) as send_email, m.unsubscribe_date as uns_date
FROM users as u
left join developers as d on d.id=u.developer_id
left join users as m on m.teams_id=d.team_id
WHERE u.unsubscribe_date <= now()
and d.skills like '%php%'
and d.skills like '%java%'
and u.role in ('ROLE_FREELANCER', 'ROLE_DEVELOPER')
and d.tags not like '%india%'
and d.tags not like '%black_list%'
and (m.unsubscribe_date <= now() OR m.unsubscribe_date is null)
group by send_email
创造

class IfFunction extends FunctionNode
{
private $expr = array();

public function parse(\Doctrine\ORM\Query\Parser $parser)
{
    $parser->match(Lexer::T_IDENTIFIER);
    $parser->match(Lexer::T_OPEN_PARENTHESIS);
    $this->expr[] = $parser->ConditionalExpression();

    for ($i = 0; $i < 2; $i++)
    {
        $parser->match(Lexer::T_COMMA);
        $this->expr[] = $parser->ArithmeticExpression();
    }

    $parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
    return sprintf('IF(%s, %s, %s)',
        $sqlWalker->walkConditionalExpression($this->expr[0]),
        $sqlWalker->walkArithmeticPrimary($this->expr[1]),
        $sqlWalker->walkArithmeticPrimary($this->expr[2]));
}
}
类IfFunction扩展了FunctionNode
{
private$expr=array();
公共函数解析(\doctor\ORM\Query\Parser$Parser)
{
$parser->match(Lexer::T_标识符);
$parser->match(Lexer::T_OPEN_括号);
$this->expr[]=$parser->ConditionalExpression();
对于($i=0;$i<2;$i++)
{
$parser->match(Lexer::T_逗号);
$this->expr[]=$parser->arithmetricexpression();
}
$parser->match(Lexer::T_CLOSE_括号);
}
公共函数getSql(\doctor\ORM\Query\SqlWalker$SqlWalker)
{
返回sprintf('IF(%s,%s,%s)',
$sqlWalker->walkConditionalExpression($this->expr[0]),
$sqlWalker->walkarthmeticsprimary($this->expr[1]),
$sqlWalker->walkarthmeticsprimary($this->expr[2]);
}
}
和我的查询生成器

     public function notificationProject($paramFetcher)
     {
     $em = $this->getEntityManager();
     $qb = $em->createQueryBuilder();

    $qb
        ->from('ArtelProfileBundle:Users', 'u')
        ->select('u.id, u.email as u_email, m.email, d.skills, u.roles, m.unsubscribeDate as uns_date')
        ->addSelect("IF(u.roles = 'ROLE_DEVELOPER', m.email, u.email) as send_email")

        ->leftJoin('u.developer', 'd') //this works assuming the doctrine mappings are correct on the $developer property in the ArtelProfileBundle:Users' entity
        ->leftJoin('d.teams', 't')
        ->leftJoin('t.users', 'm')
        ->where('u.unsubscribeDate <= :today');
    foreach($paramFetcher[1] as $skill){
        if ($skill)
        $qb
            ->andWhere($qb->expr()->like('d.skills', $qb->expr()->literal('%"' . $skill . '"%')));
    }
    $qb
        ->andWhere($qb->expr()->in('u.roles', array('ROLE_FREELANCER', 'ROLE_DEVELOPER')));

    foreach($paramFetcher[0] as $tag){
        if ($tag)
        $qb
            ->andWhere($qb->expr()->notlike('d.tags', $qb->expr()->literal('%"' . $tag . '"%')));
    }
    $qb
        ->andWhere($qb->expr()->orX('m.unsubscribeDate <= :today', $qb->expr()->isNull('m.unsubscribeDate')))
        ->groupBy('send_email')
        ->setParameter('today', new \DateTime());
    $entities = $qb->getQuery()->getArrayResult();
}
公共函数notificationProject($paramFetcher)
{
$em=$this->getEntityManager();
$qb=$em->createQueryBuilder();
$qb
->from('ArtelProfileBundle:Users','u')
->选择('u.id,u.email作为u_电子邮件,m.email,d.skills,u.roles,m.unsubscribeDate作为uns_日期')
->添加选择(“如果(u.roles='ROLE\u DEVELOPER',m.email,u.email)作为发送电子邮件”)
->leftJoin('u.developer','d')//假设在ArtelProfileBundle:Users实体中的$developer属性上的原则映射是正确的,则此操作有效
->leftJoin('d.teams','t')
->leftJoin('t.users','m')

->其中('u.unsubscribeDate在第二次查询中,您没有选择相同的内容。(在第二次查询中,谁是
发送电子邮件?)

如果您真的想释放查询生成器的功能,可以编写以下内容:

$em = $this->getEntityManager('ArtelProfileBundle:Users'); 

$qb = $em->createQueryBuilder('u');

$qb->select('u.email as u_eamil, m.email as send_email, u.roles, m.unsubscribeDate as uns_date')
   ->leftJoin('u.developer', 'd') //this works assuming the doctrine mappings are correct on the $developer property in the ArtelProfileBundle:Users' entity
   ->leftJoin('d.teams', 'm')     
   ->where('u.unsubscribeDate <= :today')
   ->andWhere($qb->expr()->like('d.skills', '%php%'))
   ->andWhere($qb->expr()->like('d.skills', '%java%'))
   ->andWhere($qb->expr()->in('u.role',array('ROLE_FREELANCER', 'ROLE_DEVELOPER')))
   ->andWhere($qb->expr()->notLike('d.tags', '%india%'))
   ->andWhere($qb->expr()->notLike('d.tags', '%black_list%'))
   ->andWhere($qb->expr()->orX('m.unsubscribeDate <= :today', $qb->expr()->isNull('m.unsubscribeDate')))
   ->groupBy('send_email')
   ->setParameter('today', new \DateTime());
$entities = $qb->getQuery()->getArrayResult();
$em=$this->getEntityManager('ArtelProfileBundle:Users');
$qb=$em->createQueryBuilder('u');
$qb->选择('u.email作为u\u eamil,m.email作为send\u email,u.roles,m.unsubscribeDate作为uns\u date')
->leftJoin('u.developer','d')//假设在ArtelProfileBundle:Users实体中的$developer属性上的原则映射是正确的,则此操作有效
->leftJoin('d.teams','m')

->where('u.unsubscribeDate maybe$qb=$em->createQueryBuilder('u');?我不理解这一点->而where('qb->expr()->)在(数组('ROLE\u freeloper','ROLE\u DEVELOPER'))中,我在user-roles中有一个字段。我更新了我的questionhave错误-调用getRootAlias()之前没有设置别名.send_email-这是经理的电子邮件。如果找到经理上的许多角色开发人员,他需要通过send_email删除与GROUP的重复帮助,我想我必须编辑一下我的查询。它来自内存,我没有测试它。您在中的这篇
$qb->expr()->是正确的(
必须添加参数,我添加了该字段。我已经更正了其中一些。如果您发现更多错误,请告诉我是否有效。
class IfFunction extends FunctionNode
{
private $expr = array();

public function parse(\Doctrine\ORM\Query\Parser $parser)
{
    $parser->match(Lexer::T_IDENTIFIER);
    $parser->match(Lexer::T_OPEN_PARENTHESIS);
    $this->expr[] = $parser->ConditionalExpression();

    for ($i = 0; $i < 2; $i++)
    {
        $parser->match(Lexer::T_COMMA);
        $this->expr[] = $parser->ArithmeticExpression();
    }

    $parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
    return sprintf('IF(%s, %s, %s)',
        $sqlWalker->walkConditionalExpression($this->expr[0]),
        $sqlWalker->walkArithmeticPrimary($this->expr[1]),
        $sqlWalker->walkArithmeticPrimary($this->expr[2]));
}
}
     public function notificationProject($paramFetcher)
     {
     $em = $this->getEntityManager();
     $qb = $em->createQueryBuilder();

    $qb
        ->from('ArtelProfileBundle:Users', 'u')
        ->select('u.id, u.email as u_email, m.email, d.skills, u.roles, m.unsubscribeDate as uns_date')
        ->addSelect("IF(u.roles = 'ROLE_DEVELOPER', m.email, u.email) as send_email")

        ->leftJoin('u.developer', 'd') //this works assuming the doctrine mappings are correct on the $developer property in the ArtelProfileBundle:Users' entity
        ->leftJoin('d.teams', 't')
        ->leftJoin('t.users', 'm')
        ->where('u.unsubscribeDate <= :today');
    foreach($paramFetcher[1] as $skill){
        if ($skill)
        $qb
            ->andWhere($qb->expr()->like('d.skills', $qb->expr()->literal('%"' . $skill . '"%')));
    }
    $qb
        ->andWhere($qb->expr()->in('u.roles', array('ROLE_FREELANCER', 'ROLE_DEVELOPER')));

    foreach($paramFetcher[0] as $tag){
        if ($tag)
        $qb
            ->andWhere($qb->expr()->notlike('d.tags', $qb->expr()->literal('%"' . $tag . '"%')));
    }
    $qb
        ->andWhere($qb->expr()->orX('m.unsubscribeDate <= :today', $qb->expr()->isNull('m.unsubscribeDate')))
        ->groupBy('send_email')
        ->setParameter('today', new \DateTime());
    $entities = $qb->getQuery()->getArrayResult();
}
$em = $this->getEntityManager('ArtelProfileBundle:Users'); 

$qb = $em->createQueryBuilder('u');

$qb->select('u.email as u_eamil, m.email as send_email, u.roles, m.unsubscribeDate as uns_date')
   ->leftJoin('u.developer', 'd') //this works assuming the doctrine mappings are correct on the $developer property in the ArtelProfileBundle:Users' entity
   ->leftJoin('d.teams', 'm')     
   ->where('u.unsubscribeDate <= :today')
   ->andWhere($qb->expr()->like('d.skills', '%php%'))
   ->andWhere($qb->expr()->like('d.skills', '%java%'))
   ->andWhere($qb->expr()->in('u.role',array('ROLE_FREELANCER', 'ROLE_DEVELOPER')))
   ->andWhere($qb->expr()->notLike('d.tags', '%india%'))
   ->andWhere($qb->expr()->notLike('d.tags', '%black_list%'))
   ->andWhere($qb->expr()->orX('m.unsubscribeDate <= :today', $qb->expr()->isNull('m.unsubscribeDate')))
   ->groupBy('send_email')
   ->setParameter('today', new \DateTime());
$entities = $qb->getQuery()->getArrayResult();