我使用Symfony 2.7
和Doctrine
开展项目。该项目管理不同的实体:
一个User
可以包含任意数量的Orders
,其中包含一个或多个OrderItems
。
现在我想要包含一个消息传递组件,它允许自动向用户发送电子邮件。每条消息都有自己的Rules
集,用于指定应该接收消息的Users
。
示例:
Users
Users
Users
,姓氏为“Doe”Users
至少有一个Order
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等)
这只能在一个查询中解决吗?
答案 0 :(得分:1)
Doctrine Query构建器有一个名为addSelect()
的方法,然后您可以添加不同的select语句..
$qb
->select('u')
->from('AppBundle:User', 'u');
if(condition)
{
$qb->addSelect('o')
->join('u.orders', 'o');
}