Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi khi sử dụng chức năng DQL tùy chỉnh với Doctrine và Symfony2

Sau nhiều lần tìm kiếm, cuối cùng tôi đã tìm ra giải pháp. Tôi đã gặp hai vấn đề:thứ nhất là hàm phân tích cú pháp của tôi bị sai, thứ hai, tôi đã gọi hàm SQL theo thứ tự của mình (cảm ơn bạn Cerad ).

Vì vậy, đây là lớp chính xác của tôi:

namespace Ypok\YPoliceBundle\DQL;

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

class CastFunction extends FunctionNode
{
    public $firstDateExpression = null;
    public $unit = null;    

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->firstDateExpression = $parser->StringPrimary();

        $parser->match(Lexer::T_AS);

        $parser->match(Lexer::T_IDENTIFIER);
        $lexer = $parser->getLexer();
        $this->unit = $lexer->token['value'];

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return sprintf('CAST(%s AS %s)',  $this->firstDateExpression->dispatch($sqlWalker), $this->unit);
    }
}

Và bây giờ, tôi có thể sử dụng hoàn hảo hàm SQL 'CAST' trong kho lưu trữ của mình:

$qb = $this->_em->createQueryBuilder();
$qb->select('d, CAST(d.myField AS UNSIGNED) AS sortx')
   ->from('\Test\MyBundle\Entity\MyEntity', 'd')
   ->orderBy('sortx', 'ASC')

return $qb->getQuery()->getResult();

Trân trọng



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql cte. sử dụng với và chèn nó cảnh báo lỗi cú pháp

  2. Nhân rộng đám mây lai cho MySQL để có tính khả dụng cao

  3. Nhận tổng số giờ làm việc trong một ngày mysql

  4. Cài đặt Django mysqlclient

  5. Mysql trả về kết quả bigint không chính xác từng lỗi một, rất lạ