我在 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('EntityProfile', 'p');
$data = $qb->getQuery()->getResult();
print_r($data);exit;
我做错了什么的任何建议?
原则停留在DBAL之上 - 数据库访问的抽象层,其目的是隐藏特定数据库实现的细节。DQL,由 Doctrine 定义的查询语言,也是以一种保持足够通用的方式构建的。这意味着 Doctrine 的设计方式是提供统一的接口,因此没有提供用于某些特定于数据库的扩展的内置工具。
但是,Doctrine 足够灵活,允许您自行扩展 DQL AST 并实现所需的特定于数据库的扩展。特别是自定义 DQL 函数(需要映射到实际 SQL)可以通过实现自己的FunctionNode
来创建,并将其作为附加功能节点注册到EntityManager
配置中。在您的情况下,它将是 $em->getConfiguration()->addCustomStringFunction()
.
有关自定义函数实现的示例,请参阅 Doctrine 文档。