Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
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
21 changes: 13 additions & 8 deletions lib/Doctrine/ORM/Query/SqlWalker.php
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,10 @@ private function generateDiscriminatorColumnConditionSQL(array $dqlAliases): str
continue;
}

$sqlTableAlias = $this->useSqlTableAliases
? $this->getSQLTableAlias($class->getTableName(), $dqlAlias) . '.'
: '';

$conn = $this->em->getConnection();
$values = [];

Expand All @@ -476,19 +480,20 @@ private function generateDiscriminatorColumnConditionSQL(array $dqlAliases): str
}

foreach ($class->subClasses as $subclassName) {
$discriminatorValue = $this->em->getClassMetadata($subclassName)->discriminatorValue;
if ($discriminatorValue === null) {
$subclassMetadata = $this->em->getClassMetadata($subclassName);

if ($subclassMetadata->reflClass->isAbstract()) {
continue;
}

$values[] = $conn->quote($discriminatorValue);
$values[] = $conn->quote($subclassMetadata->discriminatorValue);
}

$sqlTableAlias = $this->useSqlTableAliases
? $this->getSQLTableAlias($class->getTableName(), $dqlAlias) . '.'
: '';

$sqlParts[] = $sqlTableAlias . $class->getDiscriminatorColumn()['name'] . ' IN (' . implode(', ', $values) . ')';
if ($values) {
$sqlParts[] = $sqlTableAlias . $class->getDiscriminatorColumn()['name'] . ' IN (' . implode(', ', $values) . ')';
} else {
$sqlParts[] = '1=0'; // impossible condition
}
}

$sql = implode(' AND ', $sqlParts);
Expand Down
44 changes: 22 additions & 22 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/GH11199Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,9 @@

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\ORM\Exception\ORMException;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Tests\OrmFunctionalTestCase;

use function array_map;
use function explode;
use function strpos;
use function substr;
use function trim;
use Generator;

class GH11199Test extends OrmFunctionalTestCase
{
Expand All @@ -24,23 +18,29 @@ protected function setUp(): void
GH11199Root::class,
GH11199Parent::class,
GH11199Foo::class,
GH11199Bar::class,
GH11199Baz::class,
GH11199AbstractLeaf::class,
]);
}

public function dqlStatements(): Generator
{
yield ['SELECT e FROM ' . GH11199Root::class . ' e', "/WHERE g0_.asset_type IN \('root', 'foo', 'baz'\)$/"];
yield ['SELECT e FROM ' . GH11199Parent::class . ' e', "/WHERE g0_.asset_type IN \('foo'\)$/"];
yield ['SELECT e FROM ' . GH11199Foo::class . ' e', "/WHERE g0_.asset_type IN \('foo'\)$/"];
yield ['SELECT e FROM ' . GH11199Baz::class . ' e', "/WHERE g0_.asset_type IN \('baz'\)$/"];
yield ['SELECT e FROM ' . GH11199AbstractLeaf::class . ' e', '/WHERE 1=0/'];
}

/**
* @throws ORMException
* @dataProvider dqlStatements
*/
public function testGH11199(): void
public function testGH11199(string $dql, string $expectedDiscriminatorValues): void
{
$em = $this->getEntityManager();
$sql = $em->createQueryBuilder()->select('e')->from(GH11199Root::class, 'e')->getQuery()->getSQL();
$condition = substr($sql, strpos($sql, '('));
$condition = trim($condition, '()');
$conditionParts = explode(',', $condition);
$conditionParts = array_map('trim', $conditionParts);
self::assertNotContains("''", $conditionParts, 'Discriminator column condition values contain empty string');
$query = $this->_em->createQuery($dql);
$sql = $query->getSQL();

self::assertMatchesRegularExpression($expectedDiscriminatorValues, $sql);
}
}

Expand All @@ -50,9 +50,9 @@ public function testGH11199(): void
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="asset_type", type="string")
* @ORM\DiscriminatorMap({
* "foo" = "\Doctrine\Tests\ORM\Functional\Ticket\GH11199Foo",
* "bar" = "\Doctrine\Tests\ORM\Functional\Ticket\GH11199Bar",
* "baz" = "\Doctrine\Tests\ORM\Functional\Ticket\GH11199Baz",
* "root" = "\Doctrine\Tests\ORM\Functional\Ticket\GH11199Root",
* "foo" = "\Doctrine\Tests\ORM\Functional\Ticket\GH11199Foo",
* "baz" = "\Doctrine\Tests\ORM\Functional\Ticket\GH11199Baz",
* })
*/
class GH11199Root
Expand Down Expand Up @@ -84,13 +84,13 @@ class GH11199Foo extends GH11199Parent
/**
* @ORM\Entity()
*/
class GH11199Bar extends GH11199Parent
class GH11199Baz extends GH11199Root
{
}

/**
* @ORM\Entity()
*/
class GH11199Baz extends GH11199Root
abstract class GH11199AbstractLeaf extends GH11199Root
{
}