Symfony + Doctrine + MD5问题

时间:2015-06-28 10:13:14

标签: symfony doctrine-orm

我想在我的Symfony包中使用sql函数MD5,所以我在\ MyCompany \ MyBundle \ DQL \ MD5Function中添加了文件(https://gist.github.com/Basster/2774738)。

然后我改变了我的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 个答案:

答案 0 :(得分: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 :(得分:1)

或者,您可以创建自己的类来执行此操作,如此处How to create and use custom built doctrine DQL function in symfony所述。有趣的是,这个例子基于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);
    }
}