カスタム DQL 関数の登録方法

Doctrine はカスタム DQL 関数をサポートしています。詳細は、 Doctrine のクックブックの記事 “DQL User Defined Functions” を参照してください。

Symfony で、カスタム DQL 関数の登録をする際には、以下のようになります。

  • YAML
    # app/config/config.yml
    doctrine:
        orm:
            # ...
            entity_managers:
                default:
                    # ...
                    dql:
                        string_functions:
                            test_string: Acme\HelloBundle\DQL\StringFunction
                            second_string: Acme\HelloBundle\DQL\SecondStringFunction
                        numeric_functions:
                            test_numeric: Acme\HelloBundle\DQL\NumericFunction
                        datetime_functions:
                            test_datetime: Acme\HelloBundle\DQL\DatetimeFunction
    
  • XML
    <!-- 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:entity-manager name="default">
                    <!-- ... -->
                    <doctrine:dql>
                        <doctrine:string-function name="test_string>Acme\HelloBundle\DQL\StringFunction</doctrine:string-function>
                        <doctrine:string-function name="second_string>Acme\HelloBundle\DQL\SecondStringFunction</doctrine:string-function>
                        <doctrine:numeric-function name="test_numeric>Acme\HelloBundle\DQL\NumericFunction</doctrine:numeric-function>
                        <doctrine:datetime-function name="test_datetime>Acme\HelloBundle\DQL\DatetimeFunction</doctrine:datetime-function>
                    </doctrine:dql>
                </doctrine:entity-manager>
            </doctrine:orm>
        </doctrine:config>
    </container>
  • PHP
    // app/config/config.php
    $container->loadFromExtension('doctrine', array(
        'orm' => array(
            // ...
            'entity_managers' => array(
                'default' => array(
                    // ...
                    'dql' => array(
                        'string_functions' => array(
                            'test_string'   => 'Acme\HelloBundle\DQL\StringFunction',
                            'second_string' => 'Acme\HelloBundle\DQL\SecondStringFunction',
                        ),
                        'numeric_functions' => array(
                            'test_numeric' => 'Acme\HelloBundle\DQL\NumericFunction',
                        ),
                        'datetime_functions' => array(
                            'test_datetime' => 'Acme\HelloBundle\DQL\DatetimeFunction',
                        ),
                    ),
                ),
            ),
        ),
    ));
    

ソース