将pgSQL转换为Doctrine

时间:2015-08-31 18:28:03

标签: postgresql doctrine-orm query-builder

我收到错误 [语法错误]第0行,第257行:错误:预期=,<,< =,<>,>,> =,!=,得到& #39; 18' 执行此Doctrine Query Builder查询时。数据库是pgSQL。

        $query = $this->entityManager
            ->createQueryBuilder()
            ->select('s.subscriptionReference')
            ->from(
                'OTDatabase\Entity\Membership\Member',
                'm'
            )
            ->innerJoin(
                'OTDatabase\Entity\Membership\MemberSubscriptions',
                's',
                'WITH',
                'm.record = s.memberReference'
            );

        $query
            ->andWhere('s.list = 1');

        $query
            ->andWhere('m.validated IN (:validated)')
            ->setParameter('validated', array('1', '3'));

        $query
            ->andWhere($query->expr()->lt(gmdate('Y-m-d H:i:s') , 's.subscription_begins'));

        $query
            ->andWhere('
            (
                ( now() <= s.subscriptionExpires )
                OR
                ( s.subscriptionBegins <= now() AND s.subscriptionExpires IS NULL )
            )');

        $result = $query->getQuery()
                        ->getArrayResult();

为了将来参考,正确的查询(在@Logan Bailey的帮助下)是:

        $query = $this->entityManager
            ->createQueryBuilder()
            ->select('s.subscriptionReference')
            ->from(
                'OTDatabase\Entity\Membership\Member',
                'm'
            )
            ->innerJoin(
                'OTDatabase\Entity\Membership\MemberSubscriptions',
                's',
                'WITH',
                'm.record = s.memberReference'
            );

        $query
            ->andWhere('s.list = 1');

        $query
            ->andWhere('m.validated IN (:validated)')
            ->setParameter('validated', array('1', '3'));

        $query
            ->andWhere($query->expr()->lt('s.subscriptionBegins' , ':subscriptionDate'))
            ->setParameter('subscriptionDate', gmdate('Y-m-d H:i:s'));

        $query
            ->andWhere($query->expr()->orX(
                $query->expr()->lt(':subscriptionDate' , 's.subscriptionExpires'),
                $query->expr()->isNull('s.subscriptionExpires')
            ));

1 个答案:

答案 0 :(得分:1)

您必须将日期用引号括起来。您可能应该将其用作绑定参数。

$query
   ->andWhere($query->expr()->lt(':subscriptionDate' , 's.subscription_begins'))
   ->setParameter('subscriptionDate', gmdate('Y-m-d H:i:s'));