在主义查询构建器中调用自定义MySql函数

时间:2019-01-03 07:23:25

标签: php mysql doctrine-orm mysql-function

在主义查询构建器的查询字符串中使用自定义mysql函数时出现错误。
[语法错误]行0,第32行:错误:预期的已知函数,获取了'ucfirst'
mysql功能如下。

DELIMITER $$
DROP FUNCTION IF EXISTS `ucfirst`$$
CREATE FUNCTION `ucfirst`(str_value VARCHAR(5000)) RETURNS varchar(5000) CHARSET latin1 DETERMINISTIC
BEGIN
RETURN CONCAT(UCASE(LEFT(str_value, 1)),SUBSTRING(str_value, 2));  
END$$
DELIMITER;  

文档查询代码如下。

$qb = $this->em->createQueryBuilder();
$qb->select("ConcatWs(' ',ucfirst(p.firstName), ucfirst(p.lastName)) as user_name");
$qb->from('Entity\Profile', 'p');
$data = $qb->getQuery()->getResult();
print_r($data);exit;  

我在做错任何建议吗?

1 个答案:

答案 0 :(得分:0)

Doctrine停留在DBAL的顶部-用于数据库访问的抽象层,其目的是隐藏特定数据库的实现细节。 DQL是由Doctrine定义的查询语言,也是以保持足够通用的方式构建的。这意味着Doctrine的设计方式是提供统一的界面,因此不提供使用某些特定于数据库的扩展的内置功能。<​​/ p>

但是,Doctrine具有足够的灵活性,可以让您扩展DQL AST并自己实现所需的特定于数据库的扩展。特别是,可以通过实现自己的FunctionNode来创建自定义DQL函数(需要映射到实际的SQL),并将其作为附加功能节点注册到EntityManager configuration中。在您的情况下,它将是$em->getConfiguration()->addCustomStringFunction()

有关自定义函数实现的示例,请参阅准则documentation