Doctrine с несколькими условиями ИЛИ - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь преобразовать следующий запрос в doctrine

SELECT E.id,E.publication_status FROM event AS E INNER JOIN event AS ESP ON  ESP.id = E.super_parent_id 
INNER JOIN event_details AS ESPD ON ESPD.event_id = ESP.id 
INNER JOIN subscription_settings AS ES WHERE ES.event_id = E.id

AND (
(ES.subscription_start_mode="PUBLICATION" AND ESP.publication_planned_from_date >= '2020-02-04 05:30:51' AND ESP.publication_planned_from_date <= '2020-02-04 05:35:51')
OR
( ES.subscription_start_mode="SCHEDULED" AND ES.subscription_scheduled_start_date >= '2020-02-04 05:30:51' AND ES.subscription_scheduled_start_date <= '2020-02-04 05:35:51')
)

AND E.is_archived = 0 AND E.is_deleted = 0

код, пробованный в doctrine

this->createQueryBuilder("E")
         ->select("E.id,E.publicationStatus,E.isArchived,E.isCancelled")
         ->innerJoin('MYBundle:Event', 'ESP', 'WITH', 'ESP.id = E.superParent')
         ->innerJoin('MYBundle:EventDetails', 'ESPD', 'WITH', 'ESPD.event = ESP.id')
         ->innerJoin("MYBundle:SubscriptionSettings", "ES", "WHERE", "ES.event = E.id")
         ->andWhere("((ES.subscriptionStartMode='PUBLICATION' AND ESP.publicationPlannedFromDate >= :from AND  ESP.publicationPlannedFromDate <= :to) OR (ES.subscriptionStartMode='SCHEDULED' AND ES.subscriptionScheduledStarDate >= :from AND S.subscriptionScheduledStarDate <= :to))")
         ->setParameter('from', $fDate)->setParameter('to', $tDate);

, это выдает ошибку как

Syntax Error] line 0, col 336: Error: Expected end of string, got 'WHERE

1 Ответ

0 голосов
/ 04 февраля 2020

Прежде всего, andWhere обычно идет после where.

Во-вторых, предикат WHERE не допускается в условиях соединения, если он зарезервирован для части SQL. Вместо этого используйте WITH:

->innerJoin("MYBundle:SubscriptionSettings", "ES", "WHERE", "ES.event = E.id")

В-третьих, вы можете использовать andX и orX

$qb = this->createQueryBuilder("E");

$qb
    ->select(...)
    ->innerJoin(...)
    ->where(
        $qb->expr()->orX(
           $qb->expr()->andX(
               $qb->expr()->eq('ES.subscriptionStartMode', ':modePlan'),
               $qb->expr()->gt('ESP.publicationPlannedFromDate', ':from'),
               $qb->expr()->lte('ESP.publicationPlannedFromDate', ':to'),
           ),

           $qb->expr()->andX(
               $qb->expr()->eq('ES.subscriptionStartMode', ':modeSchedule'),
               $qb->expr()->gte('ESP.subscriptionScheduledStarDate', ':from'),
               $qb->expr()->lte('ESP.subscriptionScheduledStarDate', ':to'),
           ),
        )
    )
    ->setParameter('modePlan', 'PUBLICATION')
    ->setParameter('modeSchedule', 'SCHEDULED')
    ->setParameter('from', ...)
    ->setParameter('to', ...);

Пожалуйста, обратите внимание, что лучше установить параметры через setParameter, даже если он установлен c.

Вы можете смешивать операторы orX и andX по своему усмотрению. Узнайте больше об операторах DQL в официальных документах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...