diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index c60151202..54d84f3e6 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -3264,6 +3264,12 @@ class Parser $this->semanticalError('Cannot add having condition on undefined result variable.'); } + // Validate SingleValuedPathExpression (ie.: "product") + if (isset($this->queryComponents[$lookaheadValue]['metadata'])) { + $expr = $this->SingleValuedPathExpression(); + break; + } + // Validating ResultVariable if ( ! isset($this->queryComponents[$lookaheadValue]['resultVariable'])) { $this->semanticalError('Cannot add having condition on a non result variable.'); diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2780Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2780Test.php new file mode 100644 index 000000000..5539dfbbe --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2780Test.php @@ -0,0 +1,89 @@ +_schemaTool->createSchema( + [ + $this->_em->getClassMetadata(DDC2780User::class), + $this->_em->getClassMetadata(DDC2780Project::class) + ] + ); + } + + /** + * Verifies that IS [NOT] NULL can be used on join aliases + */ + public function testIssue() + { + $user = new DDC2780User; + $project = new DDC2780Project; + + $user->project = $project; + + $this->_em->persist($project); + $this->_em->persist($user); + $this->_em->flush(); + $this->_em->clear(); + + $result = $this->_em->createQueryBuilder() + ->select('user') + ->from(DDC2780User::class, 'user') + ->leftJoin('user.project', 'project') + ->where('project IS NOT NULL') + ->getQuery() + ->getOneOrNullResult(); + + $this->assertInstanceOf(DDC2780User::class, $result); + } +} + +/** + * @Entity + */ +class DDC2780User +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; + + /** + * @ManyToOne(targetEntity="DDC2780Project") + * + * @var DDC2780Project + */ + public $project; +} + +/** @Entity */ +class DDC2780Project +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; + + /** + * @OneToMany(targetEntity="DDC2780User", mappedBy="project") + * + * @var DDC2780User[] + */ + public $users; + + /** Constructor */ + public function __construct() + { + $this->users = new ArrayCollection(); + } +} +