Create your own Doctrine function

Code
<?php

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\Lexer;
use PHPSnippets\Db\Entity\Test;

class ReplaceFunction extends FunctionNode
{
    private $str;
    private $from;
    private $to;
    
    public function getSql(SqlWalker $sqlWalker)
    {
        return 'REPLACE(' .
            $this->str->dispatch($sqlWalker) . ', ' .
            $this->from->dispatch($sqlWalker) . ', ' .
            $this->to->dispatch($sqlWalker) .
        ')';
    }

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->str = $parser->StringPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->from = $parser->StringPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->to = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

// make ReplaceFunction available
$entityManager->getConfiguration()
    ->addCustomStringFunction('REPLACE', ReplaceFunction::CLASS);

$results = $entityManager->createQuery('SELECT t.name, REPLACE(t.name, \'test\', \'BAZ\') replaced FROM ' . Test::CLASS . ' t')
    ->getResult();

foreach ($results as $result) {
    echo sprintf('%s replaced to %s', $result['name'], $result['replaced']) . PHP_EOL;
}
Result
foo replaced to foo
test replaced to BAZ
bar replaced to bar
Used Versions
PHP 8.3, Laminas MVC 3.2, Symfony 5.2, Laravel 8.28, PHPUnit 9.5, Doctrine ORM 2.8