Критерии доктрины ИЛИ неверно И в запросе SQL - PullRequest
0 голосов
/ 11 марта 2019

У меня есть следующий код, который работает, когда $ranges - ArrayCollection:

        $startDateInRange = Criteria::expr()->andX(
            Criteria::expr()->lte('startDate', $startDate),
            Criteria::expr()->gte('endDate', $startDate)
        );
        $endDateInRange = Criteria::expr()->andX(
            Criteria::expr()->lte('startDate', $endDate),
            Criteria::expr()->gte('endDate', $endDate)
        );

        $isContainedByNewRange = Criteria::expr()->andX(
            Criteria::expr()->gte('startDate', $startDate),
            Criteria::expr()->lte('endDate', $endDate)
        );

        $criteria = Criteria::create()->where(
            Criteria::expr()->orX(
                $endDateInRange, 
                $startDateInRange, 
                $isContainedByNewRange
            )
        );

        $overlappingRanges = $ranges->matching($criteria);

Но когда $ranges равно PersistentCollection, генерируется неправильный запрос. Criteria::expr()->orX следует интерпретировать как (a AND b) OR (c AND d), но вместо этого интерпретировать как строку AND - a AND b AND c AND d

Реальное предложение where, которое генерируется:

WHERE t.parentEntity_id = ?
  AND te.startDate <= ?
  AND te.endDate >= ?
  AND te.startDate <= ?
  AND te.endDate >= ?
  AND te.startDate >= ?
  AND te.endDate <= ?

Что бы я ожидал:

WHERE t.parentEntity_id = ?
  AND (
     (te.startDate <= ?  AND te.endDate >= ?)
     OR (te.startDate <= ? AND te.endDate >= ?)
     OR (te.startDate >= ? AND te.endDate <= ?)
  )

Я что-то упустил или это ошибка в Doctrine?

...