MySQL, spatial-индекс и Doctrine — как заставить их работать вместе?

У меня есть таблица MySQL с полем типа POINT и Spatial key на нём, использую ORM Doctrine.
Ищу попадание точки в область с помощью MBRContains().
Написал dql-адаптер для MBRContains.
Doctrine требует, чтобы в блоке WHERE после функции стоял один из знаков [=, <, <=, <>, >, >=, !=], и это в общем случае логично. Поэтому дописал в запросе WHERE MBRContains(...) = 1. Всё работает.
НО!
Начал тестить и увидел, что индекс не используется. Explain даже в possible_keys его не показывает.
Запускаю разные варианты запроса в консоли и вижу, что "WHERE MBRContains(...)" использует индекс, а "WHERE MBRContains(...) = 1" – не использует. Но Doctrine не даёт написать в DQL "WHERE MBRContains(...)".

Как-то можно их подружить? Или заставить MySQL использовать индекс?
FORCE INDEX не помогает.

На крайняк остаётся вариант использовать raw sql, а потом мапить результаты, но хотелось бы без этого
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
zIs
@zIs Автор вопроса
Нашёл кривое решение через грязный и отвратительный хак.
В dql-адаптер для MBRContains дописал в конце определения функции в getSql() "AND 1", а в запросе пишу "MBRContains(...) AND 1=1".
Теперь индекс используется, всё работает, а я буду молиться, чтобы этот позор никто не увидел :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Skyeng Москва
До 180 000 руб.
Badoo Development Москва
от 140 000 до 180 000 руб.
Badoo Development Москва
от 180 000 до 250 000 руб.
21 авг. 2018, в 16:11
1500 руб./за проект
21 авг. 2018, в 15:45
4000 руб./за проект
21 авг. 2018, в 15:42
2500 руб./за проект