Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions tests/Type/Doctrine/QueryBuilderReproductionsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php declare(strict_types = 1);

namespace PHPStan\Type\Doctrine;

use PHPStan\Testing\TypeInferenceTestCase;

class QueryBuilderReproductionsTest extends TypeInferenceTestCase
{

/**
* @return iterable<mixed>
*/
public function dataFileAsserts(): iterable
{
yield from $this->gatherAssertTypes(__DIR__ . '/data/queryBuilderReproductions.php');
}

/**
* @dataProvider dataFileAsserts
* @param mixed ...$args
*/
public function testFileAsserts(
string $assertType,
string $file,
...$args
): void
{
$this->assertFileAsserts($assertType, $file, ...$args);
}

public static function getAdditionalConfigFiles(): array
{
return [
__DIR__ . '/data/QueryResult/config.neon',
];
}

}
20 changes: 20 additions & 0 deletions tests/Type/Doctrine/data/QueryResult/Entities/OrderItem.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php declare(strict_types=1);

namespace QueryResult\Entities;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Table(name: 'orders')]
class OrderItem
{

#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;

#[ORM\ManyToOne]
private Product $product;

}
17 changes: 17 additions & 0 deletions tests/Type/Doctrine/data/QueryResult/Entities/Product.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php declare(strict_types=1);

namespace QueryResult\Entities;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Table(name: 'products')]
class Product
{

#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(options: ['unsigned' => true])]
private ?int $id = null;

}
11 changes: 11 additions & 0 deletions tests/Type/Doctrine/data/QueryResult/entity-manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,22 @@
[__DIR__ . '/Entities']
), 'QueryResult\Entities\\');

if (PHP_VERSION_ID >= 80100) {
$metadataDriver->addDriver(
new AttributeDriver([__DIR__ . '/Entities']),
'QueryResult\Entities\\'
);
}

if (property_exists(Column::class, 'enumType') && PHP_VERSION_ID >= 80100) {
$metadataDriver->addDriver(new AnnotationDriver(
new AnnotationReader(),
[__DIR__ . '/EntitiesEnum']
), 'QueryResult\EntitiesEnum\\');
$metadataDriver->addDriver(
new AttributeDriver([__DIR__ . '/EntitiesEnum']),
'QueryResult\EntitiesEnum\\'
);
}

$config->setMetadataDriverImpl($metadataDriver);
Expand Down
31 changes: 31 additions & 0 deletions tests/Type/Doctrine/data/queryBuilderReproductions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace QueryBuilderReproductions;

use Doctrine\ORM\EntityManager;
use QueryResult\Entities\OrderItem;
use function PHPStan\Testing\assertType;

class Foo
{

/** @var EntityManager */
private $entityManager;

public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}

public function doFoo(): void
{
$result = $this->entityManager->createQueryBuilder()
->select('DISTINCT IDENTITY(oi.product) AS id')
->from(OrderItem::class, 'oi')
->join('oi.product', 'p')
->getQuery()
->getArrayResult();
assertType('list<array{id: int}>', $result);
}

}