2016-06-07 2 views
0

Я работаю над проектом с использованием Symfony 2.7 и Doctrine. Проект управляет различными сущностями: Один User может иметь любое количество Orders, которые включают в себя один или несколько OrderItems.Передает несколько правил SELECT в один запрос DQL

Теперь я хотел бы включить компонент обмена сообщениями, который позволяет автоматически отправлять электронные письма пользователям. Каждое сообщение имеет свой собственный набор Rules, который указывает Users, который должен получить сообщение.

Пример:

  • Все Users
  • Users с номером пользователя между X и Y
  • Users с LastName "Доу"
  • Users, которые имеют по крайней мере один Order
  • Users, которые имеют a Order с OrderItem XY
  • Users что имеют Order, который не оплатил
  • т.д.

вопрос: Можно ли перевести все правила сообщения в один единый DQL запрос на выборку?

Объединяя правила, которые только эффект, который 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?

Проблема заключается в том, что различные правила будут требовать различных запросов (простой ВЫБРАТЬ, ВЫБРАТЬ с JOIN, COUNT Заказов и т.д.)

Это решаемая только в одном запросе?

ответ

1

Doctrine Query Builder имеет метод addSelect(), то вы можете добавить различные операторы выбора ..

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

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

Doctrine Docs

Смежные вопросы