我从下面的Doctrine查询中收到意外结果。我不确定原因。
这是我想要创建的查询:
SELECT `subscription_reference`
FROM `member_subscriptions`
WHERE `list` = 1 AND `quantity` = 1
AND `payment_received` = 1 AND `email` = 'user@domain.com'
AND `subscription_consent_date` != '0000-00-00 00:00:00'
AND ( ( `subscription_expires` = '0000-00-00' )
OR ( '2015-01-22' <= `subscription_expires` ) )
这些是我用来组装查询的命令:
$query1 = $this->entityManager
->createQueryBuilder()
->select('s.subscriptionReference')
->from('AMDatabase\Entity\Membership\MemberSubscriptions', 's');
$query1->andWhere($query1->expr()->eq('s.list', ':list'))
->setParameter('list', 1);
$query1->andWhere($query1->expr()->eq('s.quantity', ':quantity'))
->setParameter('quantity', 1);
$query1->andWhere($query1->expr()->eq('s.paymentReceived', ':paymentReceived'))
->setParameter('paymentReceived', 1);
$query1->andWhere($query1->expr()->eq('s.email', ':email'))
->setParameter('email', $params['email_address']);
$query1->andWhere($query1->expr()->notLike('s.subscriptionConsentDate', ':subscriptionConsentDate'))
->setParameter('subscriptionConsentDate', new \DateTime('0000-00-00 00:00:00'));
$query1->orWhere($query1->expr()->eq('s.subscriptionExpires', ':subscriptionExpires1'))
->setParameter('subscriptionExpires1', '0000-00-00');
$query1->orWhere($query1->expr()->lt('s.subscriptionExpires', ':subscriptionExpires2'))
->setParameter('subscriptionExpires2', gmdate('Y-m-d'));
$result1 = $query1->getQuery()->getArrayResult();
if (is_array($result1) && count($result1) > '0') {
foreach ($result1 AS $value1) {
print_r( $value1 );
}
}
这是Doctrine查询生成的示例结果:
subscription_reference 38
member_reference 6
list 1
quantity 1
payment_received 1
email user@domain.com
subscription_consent_reference 0
subscription_consent_date 0000-00-00 00:00:00
subscription_consent_ip_address
subscription_consent_granted_name
subscription_begins 2005-11-05
subscription_expires 2014-06-30
email_delivery_hour 0
email_delivery_timezone_reference 241
last_mailing 2014-06-30
administrator_update_reference 0
administrator_update_timestamp 0000-00-00 00:00:00
出乎意料的结果是:
subscription_consent_date,其值为'0000-00-00 00:00:00'
subscription_expires的值为“2014-06-30”
多个subscription_reference
有人会告诉我如何纠正我所犯的错误吗?谢谢。
答案 0 :(得分:0)
s.subscriptionExpires的两种可能性需要在同一个&#34;以及&#34;
$query1 = $this->entityManager
->createQueryBuilder()
->select('s.subscriptionReference')
->from(
'AMDatabase\Entity\Membership\MemberSubscriptions',
's'
);
$query1
->andWhere(
$query1->expr()
->eq(
's.list',
':list'
)
)
->setParameter(
'list',
1
);
$query1
->andWhere(
$query1->expr()
->eq(
's.quantity',
':quantity'
)
)
->setParameter(
'quantity',
1
);
$query1
->andWhere(
$query1->expr()
->eq(
's.paymentReceived',
':paymentReceived'
)
)
->setParameter(
'paymentReceived',
1
);
$query1
->andWhere(
$query1->expr()
->eq(
's.email',
':email'
)
)
->setParameter(
'email',
$params['email_address']
);
$query1
->andWhere(
$query1->expr()
->notLike(
's.subscriptionConsentDate',
':subscriptionConsentDate'
)
)
->setParameter(
'subscriptionConsentDate',
new \DateTime('0000-00-00 00:00:00')
);
$query1
->andWhere('s.subscriptionExpires = :subscriptionExpires1 OR s.subscriptionExpires >= :subscriptionExpires2')
->setParameter(
'subscriptionExpires1',
'0000-00-00'
)
->setParameter(
'subscriptionExpires2',
gmdate('Y-m-d')
);
$result1 = $query1->getQuery()
->getArrayResult();
我获得了以下代码,以查看正在创建的查询以解决问题:
$q = $query1->getQuery();
$sql = $q->getSQL();
print_r( $sql );