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