Doctrine, QueryBuilder: используйте конкретное место со скобками

У меня возникла проблема с созданием "простого" запроса с помощью Doctrine QueryBuilder. Я пытаюсь получить несколько «лиц», которые находятся на расстоянии не более 10 км.

Мой запрос:

    $QB = $this->createQueryBuilder('p');
    $QB->add('select', 'p')
            ->add('from', 'MyProject\Bundle\FrontBundle\Entity\Pro p')
            ->where('p.job = :job')
            ->andWhere('(3956 * 2 * ASIN(SQRT( POWER(SIN((:latitude - abs(pro.latitude)) * pi()/180 / 2),2) + COS(:latitude * pi()/180 ) * COS(abs(pro.latitude) *  pi()/180) * POWER(SIN((:longitude - pro.longitude) *  pi()/180 / 2), 2) ))) <= 10')
            ->addOrderBy('p.dateCreation', 'DESC')
            ->addOrderBy('p.id', 'DESC')
            ->setParameter('latitude', $latitude)
            ->setParameter('longitude', $longitude)
            ->setParameter('job', $jobId);

Проблема заключается во втором утверждении «где», Doctrine не работает с «ASIN» из-за следующей скобки. Он пытается выполнить функцию... Есть ли способ избежать этого? Или другой способ построить это условие?

Спасибо за профессиональную доктрину ;)


person Doubidou    schedule 17.04.2014    source источник


Ответы (1)


Если я правильно понимаю, вы можете либо написать необработанный SQL-запрос для этого, либо реализовать функцию ASIN (или любую другую) в доктрине.

Здесь у вас есть пакет, который может помочь:

https://github.com/wiredmedia/doctrine-extensions

Вы можете использовать его реализацию функции ASIN:

https://github.com/wiredmedia/doctrine-extensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Asin.php

И статья о пользовательских функциях DQL:

http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html

person Bartłomiej Wach    schedule 17.04.2014
comment
Как я сказал (или написал), вам просто нужно добавить упомянутый пакет в свой проект, все эти функции DQL уже реализованы там, как указано в github.com/wiredmedia/ - person Bartłomiej Wach; 17.04.2014