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

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

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

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    # config/packages/doctrine.yaml
    doctrine:
        orm:
            # ...
            dql:
                string_functions:
                    test_string: App\DQL\StringFunction
                    second_string: App\DQL\SecondStringFunction
                numeric_functions:
                    test_numeric: App\DQL\NumericFunction
                datetime_functions:
                    test_datetime: App\DQL\DatetimeFunction
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!-- config/packages/doctrine.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">App\DQL\StringFunction</doctrine:string-function>
                    <doctrine:string-function name="second_string">App\DQL\SecondStringFunction</doctrine:string-function>
                    <doctrine:numeric-function name="test_numeric">App\DQL\NumericFunction</doctrine:numeric-function>
                    <doctrine:datetime-function name="test_datetime">App\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
    // config/packages/doctrine.php
    use App\DQL\StringFunction;
    use App\DQL\SecondStringFunction;
    use App\DQL\NumericFunction;
    use App\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
    # config/packages/doctrine.yaml
    doctrine:
        orm:
            # ...
            entity_managers:
                example_manager:
                    # Place your functions here
                    dql:
                        datetime_functions:
                            test_datetime: App\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
    <!-- config/packages/doctrine.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">
                            App\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
    // config/packages/doctrine.php
    use App\DQL\DatetimeFunction;
    
    $container->loadFromExtension('doctrine', array(
        'doctrine' => array(
            'orm' => array(
                // ...
                'entity_managers' => array(
                    'example_manager' => array(
                        // place your functions here
                        'dql' => array(
                            'datetime_functions' => array(
                                'test_datetime' => DatetimeFunction::class,
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ));
    

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