Функция substring_index в доктрине ORM

Я должен использовать функцию SUBSTRING_INDEX в доктрине ORM в symfony 2. Как я могу это сделать? Прямо сейчас, используя его внутри запроса, я получаю неопределенную ошибку функции:

 [Syntax Error] line 0, col 299: Error: Expected known function, got 'SUBSTRING_INDEX' 

Я использую эту функцию для получения первого числа, например:

 11.48.205.1 

Как я могу это решить?

Вот класс, представляющий функцию SUBSTRING_INDEX (не забудьте обновить пространство имен).

 <?php namespace Sad\Functions; use Doctrine\ORM\Query\AST\Functions\FunctionNode; use Doctrine\ORM\Query\Lexer; use Doctrine\ORM\Query\SqlWalker; use Doctrine\ORM\Query\Parser; /** * "SUBSTRING_INDEX" "(" ArithmeticPrimary "," ArithmeticPrimary "," ArithmeticPrimary ")" * * @author Andrey Stepanov <stepashka@gmail.com> */ class SubstringIndexFunction extends FunctionNode { public $str = null; public $delim = null; public $count = null; /** * @override */ public function getSql(SqlWalker $sqlWalker) { return 'SUBSTRING_INDEX(' . $this->str->dispatch($sqlWalker) . ', ' . $this->delim->dispatch($sqlWalker) . ', ' . $this->count->dispatch($sqlWalker) . ')'; } /** * @override */ public function parse(Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->str = $parser->ArithmeticPrimary(); $parser->match(Lexer::T_COMMA); $this->delim = $parser->ArithmeticPrimary(); $parser->match(Lexer::T_COMMA); $this->count = $parser->ArithmeticPrimary(); $parser->match(Lexer::T_CLOSE_PARENTHESIS); } } 

Вам необходимо зарегистрировать его перед созданием диспетчера сущностей:

 $config->addCustomStringFunction('SUBSTRING_INDEX', 'Sad\Functions\SubstringIndexFunction'); /* ... */ $entityManager = EntityManager::create($conn, $config); 

После этого вы получите следующие результаты:

 echo $entityManager->createQuery("SELECT p FROM \Sad\Schema\AbstractPageAny as p WHERE SUBSTRING_INDEX(p.name,'a',1) = 'P'")->getSQL(); // Output: SELECT p0_.id AS id_0, p0_.name AS name_1, p0_.type AS type_2 FROM page p0_ WHERE (SUBSTRING_INDEX(p0_.name, 'a', 1) = 'P')