Как зарегистрировать пользовательские функции DQL

Как зарегистрировать пользовательские функции DQL

Doctrine позволяет вам указать пользовательские функции DQL. Чтобы узнать больше информации по этой теме, прочтите статью Cookbook Doctrine's "Определяемые пользователем функции DQL".

В Symfony вы можете зарегистрировать ваши пользовательские функции DQL следующим образом:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    # app/config/config.yml
    doctrine:
        orm:
            # ...
            dql:
                string_functions:
                    test_string: AppBundle\DQL\StringFunction
                    second_string: AppBundle\DQL\SecondStringFunction
                numeric_functions:
                    test_numeric: AppBundle\DQL\NumericFunction
                datetime_functions:
                    test_datetime: AppBundle\DQL\DatetimeFunction
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!-- app/config/config.xml -->
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/doctrine
            http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">
    
        <doctrine:config>
            <doctrine:orm>
                <!-- ... -->
                <doctrine:dql>
                    <doctrine:string-function name="test_string">AppBundle\DQL\StringFunction</doctrine:string-function>
                    <doctrine:string-function name="second_string">AppBundle\DQL\SecondStringFunction</doctrine:string-function>
                    <doctrine:numeric-function name="test_numeric">AppBundle\DQL\NumericFunction</doctrine:numeric-function>
                    <doctrine:datetime-function name="test_datetime">AppBundle\DQL\DatetimeFunction</doctrine:datetime-function>
                </doctrine:dql>
            </doctrine:orm>
        </doctrine:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // app/config/config.php
    use AppBundle\DQL\StringFunction;
    use AppBundle\DQL\SecondStringFunction;
    use AppBundle\DQL\NumericFunction;
    use AppBundle\DQL\DatetimeFunction;
    
    $container->loadFromExtension('doctrine', array(
        'orm' => array(
            // ...
            'dql' => array(
                'string_functions' => array(
                    'test_string'   => StringFunction::class,
                    'second_string' => SecondStringFunction::class,
                ),
                'numeric_functions' => array(
                    'test_numeric' => NumericFunction::class,
                ),
                'datetime_functions' => array(
                    'test_datetime' => DatetimeFunction::class,
                ),
            ),
        ),
    ));
    

Note

Если entity_managers были ясно названы, конфигурация функций напрямую с ORM вызовет исключение "Неопределённая опция "dql" в "doctrine.orm". Блок конфигурации dql должен быть определён под названным менеджером сущностей.

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    # app/config/config.yml
    doctrine:
        orm:
            # ...
            entity_managers:
                example_manager:
                    # Place your functions here
                    dql:
                        datetime_functions:
                            test_datetime: AppBundle\DQL\DatetimeFunction
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # app/config/config.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/doctrine
            http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">
    
        <doctrine:config>
            <doctrine:orm>
                <!-- ... -->
    
                <doctrine:entity-manager name="example_manager">
                    <!-- разместите ваши функции здесь -->
                    <doctrine:dql>
                        <doctrine:datetime-function name="test_datetime">
                            AppBundle\DQL\DatetimeFunction
                        </doctrine:datetime-function>
                    </doctrine:dql>
                </doctrine:entity-manager>
            </doctrine:orm>
        </doctrine:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // app/config/config.php
    use AppBundle\DQL\DatetimeFunction;
    
    $container->loadFromExtension('doctrine', array(
        'doctrine' => array(
            'orm' => array(
                // ...
                'entity_managers' => array(
                    'example_manager' => array(
                        // разместите ваши функции здесь
                        'dql' => array(
                            'datetime_functions' => array(
                                'test_datetime' => DatetimeFunction::class,
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ));
    

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.