Вызов пользовательской функции MySql в Doctrine Query - PullRequest
0 голосов
/ 03 января 2019

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

0 голосов
/ 03 января 2019

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

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

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

...