Вызов пользовательской функции MySql в Doctrine Query

У меня возникла ошибка при использовании пользовательской функции 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 ответ

Доктрина находится поверх DBAL - уровня абстракции для доступа к базе данных, ее цель - скрыть детали реализации конкретной базы данных. DQL, язык запросов, определенный Doctrine, также построен таким образом, чтобы оставаться достаточно универсальным. Это означает, что Doctrine спроектирован таким образом, чтобы обеспечить унифицированный интерфейс и, следовательно, не предоставляет встроенных средств для использования некоторых специфичных для базы данных расширений.

Однако Doctrine достаточно гибок, чтобы позволить вам расширять DQL AST и самостоятельно внедрять необходимые расширения для базы данных. В частности, пользовательская функция DQL (которая должна быть сопоставлена ​​с реальным SQL) может быть создана путем реализации собственного FunctionNode и зарегистрировать его как дополнительный функциональный узел в EntityManager Конфигурация В вашем случае это будет $em->getConfiguration()->addCustomStringFunction(),

Пожалуйста, обратитесь к документации Doctrine для примера реализации пользовательской функции.

Другие вопросы по тегам