在doctrine query builders query中调用自定义mysql函数

yjghlzjz  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(452)

在doctrine query builders查询字符串中使用自定义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;

有什么建议我哪里做错了吗?

hwamh0ep

hwamh0ep1#

条令位于数据库访问的dbal抽象层之上,其目的是隐藏特定数据库的实现细节。dql是由条令定义的查询语言,它的构建方式也是为了保持足够的通用性。这意味着条令是以提供统一接口的方式设计的,因此不提供用于某些特定于数据库的扩展的内置设施。
不过,这个原则足够灵活,可以让您自己扩展dqlast并实现所需的特定于数据库的扩展。特别是自定义dql函数(需要Map到实际sql)可以通过实现自己的 FunctionNode 并将其作为附加功能节点注册到 EntityManager 配置。你的情况是 $em->getConfiguration()->addCustomStringFunction() .
有关自定义函数实现的示例,请参阅条令文档。

相关问题