diff --git a/tests/Type/Doctrine/QueryBuilder/QueryBuilderGetQueryDynamicReturnTypeExtensionTest.php b/tests/Type/Doctrine/QueryBuilder/QueryBuilderGetQueryDynamicReturnTypeExtensionTest.php index 0dd41dfe..ac653713 100644 --- a/tests/Type/Doctrine/QueryBuilder/QueryBuilderGetQueryDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Doctrine/QueryBuilder/QueryBuilderGetQueryDynamicReturnTypeExtensionTest.php @@ -11,6 +11,7 @@ class QueryBuilderGetQueryDynamicReturnTypeExtensionTest extends TypeInferenceTe public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/../data/QueryResult/queryBuilderGetQuery.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/../data/QueryResult/bug-245.php'); } /** diff --git a/tests/Type/Doctrine/data/QueryResult/Entities/Many.php b/tests/Type/Doctrine/data/QueryResult/Entities/Many.php index 775a66e3..af189ed0 100644 --- a/tests/Type/Doctrine/data/QueryResult/Entities/Many.php +++ b/tests/Type/Doctrine/data/QueryResult/Entities/Many.php @@ -8,6 +8,7 @@ use Doctrine\ORM\Mapping\JoinColumn; use Doctrine\ORM\Mapping\JoinColumns; use Doctrine\ORM\Mapping\ManyToOne; +use Doctrine\ORM\Mapping as ORM; /** * @Entity @@ -102,3 +103,38 @@ class Many */ public $compoundPkAssoc; } + +/** + * @Entity + */ +class Bug245Episode +{ + /** + * @var \Doctrine\Common\Collections\Collection + * @ORM\OneToMany( + * targetEntity="App\VideoBundle\Entity\Segment", + * mappedBy="episode", + * cascade={"persist", "remove"}, + * orphanRemoval=true + * ) + * @ORM\OrderBy({"position" = "ASC"}) + */ + private $segments; +} + +/** + * @ORM\Entity + */ +class Bug245Segment +{ + /** + * @ORM\ManyToOne( + * targetEntity="App\VideoBundle\Entity\Episode", + * inversedBy="segments", + * cascade={"persist"} + * ) + * @ORM\JoinColumn(name="episode_id", referencedColumnName="id", nullable=false) + * @var Bug245Episode + */ + private $episode; +} diff --git a/tests/Type/Doctrine/data/QueryResult/bug-245.php b/tests/Type/Doctrine/data/QueryResult/bug-245.php new file mode 100644 index 00000000..b165aac5 --- /dev/null +++ b/tests/Type/Doctrine/data/QueryResult/bug-245.php @@ -0,0 +1,34 @@ +em->createQueryBuilder() + ->select('episode.id') + ->from(Bug245Episode::class, 'episode', 'episode.id') + ->where('episode.segmentsComplete = false') + ->andWhere('0 != SIZE(episode.segments)') + ->andWhere( + '0 < (SELECT COUNT(last_segment.id) FROM ' . Bug245Segment::class . ' as last_segment + WHERE last_segment.episode = episode.id AND last_segment.isLastSegment = true)' + ) + ->andWhere( + "0 = (SELECT COUNT(segment.id) FROM " . Bug245Segment::class . " as segment + WHERE segment.episode = episode.id AND segment.state != 'distributed')" + )->getQuery()->getResult(); + assertType('mixed', $result); + } + +}