【问题标题】:Transle multiple SELECT rules into a single DQL query将多个 SELECT 规则转换为单个 DQL 查询
【发布时间】:2016-06-07 14:57:51
【问题描述】:

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

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

例子:

  • 全部Users
  • Users 用户编号在 X 和 Y 之间
  • Users 姓“Doe”
  • Users 至少有一个 Order
  • Users 有一个 OrderOrderItem 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、带有 JOIN 的 SELECT、订单计数等)

这是否可以在一个查询中解决?

【问题讨论】:

    标签: mysql symfony doctrine dql


    【解决方案1】:

    Doctrine Query builder 有一个名为 addSelect() 的方法,然后您可以添加不同的选择语句..

    $qb
      ->select('u')
      ->from('AppBundle:User', 'u');
    
    if(condition)
    {
      $qb->addSelect('o')
         ->join('u.orders', 'o');
    }
    

    Doctrine Docs

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 2011-04-16
      • 2014-03-02
      • 1970-01-01
      • 2015-04-02
      • 2013-08-11
      • 2020-12-10
      • 2017-03-23
      相关资源
      最近更新 更多