0

我在教义查询构建器查询字符串中使用自定义 mysql 函数时出错。
[语法错误] line 0, col 32: Error: Expected known function, got 'ucfirst'
mysql function如下。

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;  

有什么建议我做错了吗?

4

1 回答 1

0

Doctrine 位于DBAL之上——数据库访问的抽象层,其目的是隐藏特定数据库的实现细节。DQL,由 Doctrine 定义的查询语言,也是以保持足够通用的方式构建的。这意味着 Doctrine 的设计方式是提供统一的接口,因此没有提供内置工具来使用某些特定于数据库的扩展。

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

请参阅 Doctrine文档以获取自定义函数实现的示例。

于 2019-01-03T10:57:14.637 回答