在DQL中使用SHA1的任何方式

Ben*_*der 3 dql symfony doctrine-orm

下面的DQL生成错误:[Syntax Error] line 0, col 42: Error: Expected known function, got 'sha1'

有没有使用SHA1的方法?

public function findIdByDql($hashId)
{
    $em = $this->getEntityManager();
    $query = $em->createQuery('DELETE FROM CarBrandBundle:Brands b WHERE sha1(b.id) = :id')
                ->setParameter('id', $hashId)
                ->execute();

    return;
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ski 8

您需要创建自己的函数来转换sha1函数.

你的app/config/config.yml档案:

doctrine:
     orm:
          dql:
             string_functions:
                 sha1: YourBundle\DQL\Sha
Run Code Online (Sandbox Code Playgroud)

你的src/YourBundle/DQL/Sha.php档案:

namespace YourBundle\DQL;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Lexer;

class Sha extends FunctionNode
{
    public $valueToSha = null;

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->valueToSha = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(SqlWalker $sqlWalker)
    {
        return
         "sha1("
        . $this->valueToSha->dispatch($sqlWalker)
        . ")";
    }
}
Run Code Online (Sandbox Code Playgroud)

查看doc以获取更多信息