Я нашел решение (в некотором роде похожее на ваше), добавив следующие строки в мой файл doctrine.php:
$q = file_get_contents('../configs/sql/routines.sql');
$conn = Doctrine_Manager::connection();
$conn->execute($q);
Теперь, каждый раз, когда я выполняю ./doctrine build-all-reload, выполняется следующий скрипт:
DROP FUNCTION IF EXISTS DIST;
CREATE FUNCTION DIST (fi11 DOUBLE, ksi11 DOUBLE, fi22 DOUBLE, ksi22 DOUBLE)
RETURNS DOUBLE
DETERMINISTIC
BEGIN
DECLARE d DOUBLE;
DECLARE fi1 DOUBLE;
DECLARE fi2 DOUBLE;
DECLARE ksi1 DOUBLE;
DECLARE ksi2 DOUBLE;
SET fi1 = PI()*(fi11)/180;
SET fi2 = PI()*(fi22)/180;
SET ksi1 = PI()*(ksi11)/180;
SET ksi2 =PI()*(ksi22)/180;
SET d = ACOS((SIN(fi1)*SIN(fi2))+(COS(fi1)*COS(fi2)*COS((ksi1-ksi2))))*6371.0;
RETURN d;
END;
Возможно, это решение не элегантное, но у меня работает :)
Я не планирую менять базу данных с MySQL.
После этого я могу использовать функцию DIST в Doctrine Queries, и она работает в несколько раз быстрее, чем стандартная реализация встроенных функций, и намного короче.
$q->where('DIST(a.lan, a.lon, b.lan, b.lon) < ?', array(2.0));
Стоит
$q->where('ACOS((SIN(...)... ... wrrrr ;-P ))*6371.0 < ?', array(2.0));
Спасибо за вашу помощь.