У меня есть следующий код, который работает, когда $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?