doctrine2: как да използвам произволната персонализирана функция?

Използвам doctrine2 в рамката на symfony2. И искам да избера едно произволно поле. Не искам да използвам родната заявка или да получавам случайни с PHP.

Опитах се да направя това според

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html

https://gist.github.com/Ocramius/919465

Разширената функция, свързана в config.yml

orm:
    ...
    entity_managers:
        default:
            ...

            dql:
                numeric_functions:
                    rand: MyProject\MyBundle\DQL\Rand

Опитвам се да извикам заявката в контролера

    $product= $em->createQueryBuilder('p')
                 ->select('w')
                 ->from('MyBundle:Product', 'p')
                // ->orderBy('RAND ()') // I tried so
                 ->addSelect('RAND() as HIDDEN rand') // and so
                 ->orderBy('rand')
                 ->getQuery()
                 ->getSingleResult();

и аз също опитах

       $product = $em->createQuery('SELECT p FROM MyBundle:Product p ORDER BY RAND()')
                     ->setMaxResults(1)
                     ->getSingleResult();

Получавам грешката:

           Error: Expected end of string, got '(' 

Имайте предвид, че "ASC" следва след "RAND()" в заявката. Опитах се да извикам orderBy('RAND()', ''), но неуспешно...


person user3342506    schedule 28.02.2014    source източник
comment
Свързана статия относно ORDER BY RAND() предупреждения   -  person Touki    schedule 28.02.2014


Отговори (1)


С този пакет: https://github.com/mapado/MysqlDoctrineFunctions

Можете да използвате функциите във вашата DQL заявка:

$query = 'SELECT RAND(), ROUND(123.45) 
    FROM ...
';

$em-›createQuery($query);

Но не можете да използвате ->orderBy...

4.8.2. Мога ли да сортирам по функция (например ORDER BY RAND()) в DQL?

Не, не се поддържа сортиране по функция в DQL. Ако имате нужда от тази функционалност, трябва или да използвате естествена заявка, или да измислите друго решение. Като странична бележка: Сортирането с ORDER BY RAND() е болезнено бавно, като се започне от 1000 реда.

http://docs.doctrine-project.org/en/2.1/reference/faq.html#can-i-sort-by-a-function-for-example-order-by-rand-in-dql

person bob12    schedule 02.03.2014