Symfony 4 was released on November 30th.
Update now to the best Symfony ever!

You are browsing the Symfony 4 documentation, which changes significantly from Symfony 3.x. If your app doesn't use Symfony 4 yet, browse the Symfony 3.4 documentation.

How to Register custom DQL Functions

How to Register custom DQL Functions

Doctrine allows you to specify custom DQL functions. For more information on this topic, read Doctrine's cookbook article "DQL User Defined Functions".

In Symfony, you can register your custom DQL functions as follows:

  • 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

In case the entity_managers were named explicitly, configuring the functions with the orm directly will trigger the exception Unrecognized option "dql" under "doctrine.orm". The dql configuration block must be defined under the named entity manager.

  • 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">
                    <!-- place your functions here -->
                    <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,
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ));
    

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.