我想在我的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”
答案 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);
}
}