在ZF2服务中给出意外结果的学说查询

时间:2015-01-22 17:36:02

标签: doctrine-orm

我从下面的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

出乎意料的结果是:

  1. subscription_consent_date,其值为'0000-00-00 00:00:00'

    • 我需要它有一个实际的日期,例如'2005-11-05 11:30:34'
  2. subscription_expires的值为“2014-06-30”

    • 我需要这个日期在将来或'0000-00-00'(意味着订阅正在进行中)
  3. 多个subscription_reference

    • 正在选择多个订阅,而不是我试图描述的订阅。我期待查询中给出的电子邮件地址与所有其他订阅者隔离。
  4. 有人会告诉我如何纠正我所犯的错误吗?谢谢。

1 个答案:

答案 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 );