У меня возникла ошибка при использовании пользовательской функции 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;
какие-либо предложения, где я делаю неправильно?
Доктрина остается на вершине DBAL — Уровень абстракции для доступа к базе данных, его цель — скрыть детали реализации конкретной базы данных. DQL, Язык запросов, определенный Doctrine, также построен таким образом, чтобы оставаться достаточно универсальным. Это означает, что Doctrine спроектирован таким образом, чтобы обеспечить унифицированный интерфейс и, следовательно, не предоставляет встроенных средств для использования некоторых специфичных для базы данных расширений.
Однако Doctrine достаточно гибок, чтобы позволить вам расширять DQL AST и самостоятельно внедрять необходимые специфичные для базы данных расширения. В частности, пользовательская функция DQL (которую необходимо сопоставить с реальным SQL) может быть создана путем реализации собственного FunctionNode
и зарегистрировать его как дополнительный функциональный узел в EntityManager
конфигурация. В вашем случае это будет $em->getConfiguration()->addCustomStringFunction()
,
Пожалуйста, обратитесь Доктрина документация например, реализация пользовательской функции.
Других решений пока нет …