将多个SELECT规则转换为单个DQL查询

时间:2016-06-07 14:57:52

标签: mysql symfony doctrine dql

我使用Symfony 2.7Doctrine开展项目。该项目管理不同的实体: 一个User可以包含任意数量的Orders,其中包含一个或多个OrderItems

现在我想要包含一个消息传递组件,它允许自动向用户发送电子邮件。每条消息都有自己的Rules集,用于指定应该接收消息的Users

示例:

  • 全部Users
  • 用户编号介于X和Y之间的
  • Users
  • Users,姓氏为“Doe”
  • Users至少有一个Order
  • {li> Users Order OrderItem XY
  • Users,其中Order尚未付款

问题是:是否可以将消息的所有规则转换为单个 DQL SELECT查询?

将仅影响User的规则合并到一个查询中是没有问题的:

public function getMatchingUsers($rules) {
    $qb = $this->em->createQueryBuilder();

    $qb_expense->select('u')
        ->from('AppBundle:User', 'u');      

    foreach ($rules as $rule) {
        $property = $rule->getProperty();
        $operator = $rule->getOperator(); // --> =, !=, <, >, <= or >=
        $value = $rule->getValue();

        switch ($property) {
            case ($property == UserMessage::FUNC_USER_NO): {
                $qb
                    ->andWhere('u.userNo :operator :value')
                    ->setParameter('operator', $operator)
                    ->setParameter('value', $value);                
                break;
            }
            case ($property == UserMessage::FUNC_NAME): {
                $qb
                    ->andWhere('u.name = :value')
                    ->setParameter('value', $value);                
                break;
            }
            ...
        }
    }

    ...
}

但是如何添加/包含影响User但他的Orders甚至是OrderItems 的规则?

问题是,不同的规则需要不同的查询(简单的SELECT,SELECT with JOIN,COUNT of Orders等)

这只能在一个查询中解决吗?

1 个答案:

答案 0 :(得分:1)

Doctrine Query构建器有一个名为addSelect()的方法,然后您可以添加不同的select语句..

$qb
  ->select('u')
  ->from('AppBundle:User', 'u');

if(condition)
{
  $qb->addSelect('o')
     ->join('u.orders', 'o');
}

Doctrine Docs