Doctrine запускает два запроса, первый отдельный, в режиме, называемом «подзапрос лимита», когда у вас есть базовая таблица и вы объединяетесь через отношение один ко многим. Это потому, что вы собираетесь выбрать продукт объединения, и в итоге будет больше строк, чем есть записей в базовой таблице. Например, база данных вернет событие № 5 в две строки, если для события № 5 существует два типа события. Эти два запроса относятся только к MySQL, другие базы данных могут выполнять ограничение в подзапросе, а Doctrine генерирует один запрос.
Поскольку ваши События имеют несколько дат, а EventDate имеет составной первичный ключ, Doctrine ДОЛЖНА выбрать отдельный набор (event_id, start_datetime) в первом запросе, но, похоже, игнорирует вторую часть вашего составного первичного ключа, вероятно, потому что он не может вставить их в предложение ON во втором запросе.
Вероятно, вы можете обойти это одним из двух, а может быть и трех способов:
1) добавить уникальный первичный ключ в EventDate (столбец автоинкремента). Вы, вероятно, не должны ссылаться на это где-либо еще, но доктрина начнет использовать это
2) сделать 2 запроса вручную. Выберите все различные event_id, start_datetime из EventDate, добавьте свой лимит и смещение, а затем программно создайте предложение where:
... WHERE ((event_id = ? AND start_datetime = ?) OR (event_id = ? AND start_datetime = ?))...
3) Измените порядок запроса, чтобы начать с другой таблицы или добавьте DISTINCT в выборку. Попробуйте выбрать разные (ed.event_id, ed.start_datetime). Иногда эти вещи могут избежать запуска алгоритма limit-subquery.
4) Выключите эту систему, см. Ссылку ниже, никогда не пробовал этого, и я не уверен, какие побочные эффекты существуют в гидратации и кеше объектов доктрины.
Лично я бы пошел с # 1. Я обнаружил, что всегда полезно иметь дополнительный столбец первичного ключа с Doctrine, даже если вы можете сформировать первичный ключ в нескольких столбцах.
Если вы хотите увидеть, как доктрина использует для этого код, см. Lib / Doctrine / Record.php, функция getLimitSubquery (). Вы заметите комментарий "// как насчет составных ключей?" в коде дважды. Вы также можете прочитать http://www.doctrine -project.org / Documentation / manual / 1_2 / ru / dql-doctrine-query-language: limit-and-offset-Clauses: алгоритм-limit-subquery-алгоритм