Symfony + Doctrine + MD5问题

4
我想在我的Symfony bundle中使用sql函数MD5,所以我添加了文件(https://gist.github.com/Basster/2774738)到\MyCompany\MyBundle\DQL\MD5Function。
然后我更改了我的config.yml文件:
# app/config/config.yml
doctrine:
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        # Added configuration for MD5 function
        entity_managers:
            default:
                dql:
                    string_functions:
                        MD5: MyCompany\MyBundle\DQL\MD5Function

但我遇到了以下错误:

在ArrayNode.php的309行中,InvalidConfigurationException:在“doctrine.orm”下未识别选项“naming_strategy, auto_mapping”

2个回答

20

您混淆了一个实体管理器配置和多个实体管理器的配置。

您应该使用:

# app/config/config.yml
doctrine:
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        # Added configuration for MD5 function
        dql:
            string_functions:
                MD5: MyCompany\MyBundle\DQL\MD5Function
或者:
# app/config/config.yml
doctrine:
    orm:
        entity_managers:
            default:
                auto_generate_proxy_classes: "%kernel.debug%"
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                # Added configuration for MD5 function
                dql:
                    string_functions:
                        MD5: MyCompany\MyBundle\DQL\MD5Function

1

或者你可以创建自己的类来完成这个任务,就像这里所解释的那样 如何在Symfony中创建和使用自定义构建的Doctrine DQL函数。有趣的是,这个例子是基于SHA1的,所以你可以像我下面做的那样简单地将SH1更改为MD5。

你的自定义MD5类

namespace Football\FrontendBundle\DQL;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

class Md5 extends FunctionNode
{
    public $value;

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->value = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(SqlWalker $sqlWalker)
    {
        return 'MD5(' . $this->value->dispatch($sqlWalker) . ')';
    }
}

在config.yml中注册它。
doctrine:
    orm:
        dql:
            string_functions:
                MD5: Football\FrontendBundle\DQL\Md5

将它像这样在你的代码库中使用。
namespace Football\FrontendBundle\Repository;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;

class CountryRepository extends EntityRepository
{
    public function findOneCountryBy($id)
    {
        return
            $this
                ->createQueryBuilder('c')
                ->select('c, MD5(c.code) AS code')
                ->where('c.id = :id')
                ->setParameter('id', $id)
                ->getQuery()
                ->getSingleResult(Query::HYDRATE_SCALAR);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接