Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1521

No way reuse parameters in custom function twice

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Invalid
    • Affects Version/s: 2.1.1
    • Fix Version/s: 2.x
    • Component/s: DQL
    • Security Level: All
    • Labels:
      None
    • Environment:
      sf2

      Description

      There is custom function:

      class DistanceFunction extends FunctionNode
      {
      	protected $fromLat;
      	protected $fromLng;
      	protected $toLat;
      	protected $toLng;
      
      	public function parse(\Doctrine\ORM\Query\Parser $parser)
      	{
      		$parser->match(Lexer::T_IDENTIFIER);
      		$parser->match(Lexer::T_OPEN_PARENTHESIS);
      
      		$this->fromLat = $parser->ArithmeticPrimary();
      		$parser->match(Lexer::T_COMMA);
      
      		$this->fromLng = $parser->ArithmeticPrimary();
      		$parser->match(Lexer::T_COMMA);
      
      		$this->toLat = $parser->ArithmeticPrimary();
      		$parser->match(Lexer::T_COMMA);
      
      		$this->toLng = $parser->ArithmeticPrimary();
      
      		$parser->match(Lexer::T_CLOSE_PARENTHESIS);
      	}
      
      	public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
      	{
      		$fromLat = $this->fromLat->dispatch($sqlWalker);
      		$fromLng = $this->fromLng->dispatch($sqlWalker);
      		$toLat = $this->toLat->dispatch($sqlWalker);
      		$toLng = $this->toLng->dispatch($sqlWalker);
      
      		$earthDiameterInKM = 1.609344 * 3956 * 2;
      
      		$sql = "($earthDiameterInKM * ASIN(SQRT(POWER(" .
      			"SIN(($fromLat - ABS($toLat)) * PI() / 180 / 2), 2) + " .
      			"COS($fromLat * PI() / 180) * COS(ABS($toLat) * PI() / 180) * " .
      			"POWER(SIN(($fromLng - $toLng) * PI() / 180 / 2), 2) " .
      			")))";
      
      //echo $sql;
      
      		return $sql;
      	}
      

      and the usage of it

      $em
      	->createQuery('SELECT DISTANCE(a.latitude, a.longitude, :lat, :lng) FROM Ololo:AbstractArea a WHERE a = 2')
      	->setParameter('lat', 1)
      	->setParameter('lng', 2)
      	->getResult();
      

      what this function generate:

      (12733.129728 * ASIN(SQRT(POWER(SIN((t0_.latitude - ABS(?)) * PI() / 180 / 2), 2) + COS(t0_.latitude * PI() / 180) * COS
      (ABS(?) * PI() / 180) * POWER(SIN((t0_.longitude - ?) * PI() / 180 / 2), 2) )))
      

      and exception raised: "SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens"

      Don't know, does it affects on master branch (does they support native named parameters?).

        Activity

          People

          • Assignee:
            Guilherme Blanco
            Reporter:
            Konstantin
          • Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: