Я следовал официальным инструкциям на странице ссылки доктрины и нескольких других источниках, но я не могу понять, что не так.
Очевидно это не загружает мою пользовательскую функцию.
Я использую ZF2 + Doctrine 2 с настройкой автозагрузчика.
Вот что у меня есть:
Ошибка:
[Синтаксическая ошибка], строка 0, столбец 7: Ошибка: ожидаемая идентификационная переменная |
Скаляр Экспресс | AggregateExpression | FunctionDeclaration |
PartialObjectExpression | «(» Подвыбрать «)» | CaseExpression, получил
‘ОТ’args: [«ВЫБРАТЬ ИЗ CadastrosAuxiliares \ Entity \ Bairro b WHERE
upper_tira_acento (b.uf) =: uf «] 0:» ВЫБРАТЬ ИЗ
CadastrosAuxiliares \ Entity \ Bairro b WHERE upper_tira_acento (b.uf) =
: uf «class: файл» Doctrine \ ORM \ Query \ QueryException «:
Функция «(…) / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php»
: «dqlError» строка: 448 тип: «::»
doctrine.global.php
<?php
return array(
'doctrine' => array(
'configuration' => array(
'orm_default' => array(
'string_functions' => array(
'upper_tira_acento' => 'Application\DoctrineFunction\UpperTiraAcento'
),
)
)
)
);
UpperTiraAcento.php
<?php
namespace Application\DoctrineFunction;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\SqlWalker;
class UpperTiraAcento extends FunctionNode
{
public $parameters = array();
const STRING_PARAM = 'string';
/**
* {@inheritdoc}
*/
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->parameters[self::STRING_PARAM] = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(SqlWalker $sqlWalker)
{
$string = $sqlWalker->walkStringPrimary($this->parameters[self::STRING_PARAM]);
return sprintf('dbo.upper_tira_acento(%s)',$string);
}
}
Пример построителя DQL:
$qbBairro = $em->createQueryBuilder()->from('CadastrosAuxiliares\Entity\Bairro', 'b');
$qbBairro->andWhere("upper_tira_acento(b.uf) = :uf")->setParameter('uf', $estado->getId());
Кто-нибудь имеет представление о том, что может быть проблема?
Заранее благодарю за любую помощь.
Ошибка выбрасывается, потому что в вашем ничего нет SELECT
пункт. Не уверен, что вызывает это.
SELECT FROM CadastrosAuxiliares\Entity\Bairro b WHERE upper_tira_acento(b.uf)
должно быть
SELECT b FROM CadastrosAuxiliares\Entity\Bairro b WHERE upper_tira_acento(b.uf)
^
Попробуйте один раз так:
$em->createQueryBuilder('b')
// ^
->from('CadastrosAuxiliares\Entity\Bairro', 'b');
->andWhere("upper_tira_acento(b.uf) = :uf")->setParameter(
'uf', $estado->getId()
);
Других решений пока нет …