在DQL中使用SHA1的任何方式 [英] Any way of using SHA1 in DQL

查看:136
本文介绍了在DQL中使用SHA1的任何方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下DQL会生成错误: [语法错误]行0,列42:错误:预期的已知功能,获得'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;
}


解决方案

您需要创建自己的函数将转换 sha1 函数。



您的 app / config / config.yml 文件:







$ b $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

您的 src / YourBundle / DQL / Sha.php file: / p>

 命名空间YourBundle\DQL; 

使用Doctrine\ORM\Query\AST\Functions\FunctionNode;
使用Doctrine\ORM\Query\Parser;
使用Doctrine\ORM\Query\SqlWalker;
使用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)
。);
}
}

检查 doc 了解更多信息


DQL below generates an error:[Syntax Error] line 0, col 42: Error: Expected known function, got 'sha1'

Any way of using 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;
}

解决方案

You need to create your own function which will translate sha1 function.

Your app/config/config.yml file:

doctrine:
     orm:
          dql:
             string_functions:
                 sha1: YourBundle\DQL\Sha

Your src/YourBundle/DQL/Sha.php file:

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)
        . ")";
    }
}

Check doc for more info

这篇关于在DQL中使用SHA1的任何方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆