Skip to content

Commit b596e6a

Browse files
authored
Allow DiscriminatorColumn with length=0 (#9410)
1 parent 79d3cf5 commit b596e6a

3 files changed

Lines changed: 110 additions & 4 deletions

File tree

lib/Doctrine/ORM/Mapping/DiscriminatorColumn.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
#[Attribute(Attribute::TARGET_CLASS)]
1616
final class DiscriminatorColumn implements Annotation
1717
{
18-
/** @var string */
18+
/** @var string|null */
1919
public $name;
2020

21-
/** @var string */
21+
/** @var string|null */
2222
public $type;
2323

24-
/** @var int */
24+
/** @var int|null */
2525
public $length;
2626

2727
/**

lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public function loadMetadataForClass($className, ClassMetadata $metadata)
281281
[
282282
'name' => $discrColumnAnnot->name,
283283
'type' => $discrColumnAnnot->type ?: 'string',
284-
'length' => $discrColumnAnnot->length ?: 255,
284+
'length' => $discrColumnAnnot->length ?? 255,
285285
'columnDefinition' => $discrColumnAnnot->columnDefinition,
286286
]
287287
);

tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Doctrine\ORM\Mapping\ClassMetadata;
1212
use Doctrine\ORM\Mapping\ClassMetadataFactory;
1313
use Doctrine\ORM\Mapping\Column;
14+
use Doctrine\ORM\Mapping\DiscriminatorColumn;
1415
use Doctrine\ORM\Mapping\DiscriminatorMap;
1516
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
1617
use Doctrine\ORM\Mapping\Entity;
@@ -33,6 +34,7 @@
3334
use Doctrine\Tests\Models\DirectoryTree\Directory;
3435
use Doctrine\Tests\Models\DirectoryTree\File;
3536
use Doctrine\Tests\Models\ECommerce\ECommerceCart;
37+
use Generator;
3638

3739
class AnnotationDriverTest extends AbstractMappingDriverTest
3840
{
@@ -274,6 +276,30 @@ public function testAttributeOverridesMappingWithTrait(): void
274276
self::assertArrayHasKey('example_trait_bar_id', $metadataWithoutOverride->associationMappings['bar']['joinColumnFieldNames']);
275277
self::assertArrayHasKey('example_entity_overridden_bar_id', $metadataWithOverride->associationMappings['bar']['joinColumnFieldNames']);
276278
}
279+
280+
/**
281+
* @psalm-param class-string $class
282+
*
283+
* @dataProvider provideDiscriminatorColumnTestcases
284+
*/
285+
public function testLengthForDiscriminatorColumn(string $class, int $expectedLength): void
286+
{
287+
$factory = $this->createClassMetadataFactory();
288+
289+
$metadata = $factory->getMetadataFor($class);
290+
291+
self::assertNotNull($metadata->discriminatorColumn);
292+
self::assertArrayHasKey('length', $metadata->discriminatorColumn);
293+
self::assertSame($expectedLength, $metadata->discriminatorColumn['length']);
294+
}
295+
296+
public function provideDiscriminatorColumnTestcases(): Generator
297+
{
298+
yield [DiscriminatorColumnWithNullLength::class, 255];
299+
yield [DiscriminatorColumnWithNoLength::class, 255];
300+
yield [DiscriminatorColumnWithZeroLength::class, 0];
301+
yield [DiscriminatorColumnWithNonZeroLength::class, 60];
302+
}
277303
}
278304

279305
/**
@@ -438,3 +464,83 @@ class AnnotationSLCFoo
438464
*/
439465
public $id;
440466
}
467+
468+
/**
469+
* @Entity
470+
* @InheritanceType("SINGLE_TABLE")
471+
* @DiscriminatorColumn(
472+
* name="type",
473+
* type="string",
474+
* length=0,
475+
* columnDefinition="enum('region','airport','station','poi') NOT NULL",
476+
* ),
477+
* @DiscriminatorMap({"s"="SuperEntity", "c"="ChildEntity"})
478+
*/
479+
class DiscriminatorColumnWithZeroLength
480+
{
481+
/**
482+
* @var int
483+
* @Id
484+
* @Column
485+
*/
486+
public $id;
487+
}
488+
489+
/**
490+
* @Entity
491+
* @InheritanceType("SINGLE_TABLE")
492+
* @DiscriminatorColumn(
493+
* name="type",
494+
* type="string",
495+
* ),
496+
* @DiscriminatorMap({"s"="SuperEntity", "c"="ChildEntity"})
497+
*/
498+
class DiscriminatorColumnWithNoLength
499+
{
500+
/**
501+
* @var int
502+
* @Id
503+
* @Column
504+
*/
505+
public $id;
506+
}
507+
508+
/**
509+
* @Entity
510+
* @InheritanceType("SINGLE_TABLE")
511+
* @DiscriminatorColumn(
512+
* name="type",
513+
* type="string",
514+
* length=60,
515+
* ),
516+
* @DiscriminatorMap({"s"="SuperEntity", "c"="ChildEntity"})
517+
*/
518+
class DiscriminatorColumnWithNonZeroLength
519+
{
520+
/**
521+
* @var int
522+
* @Id
523+
* @Column
524+
*/
525+
public $id;
526+
}
527+
528+
/**
529+
* @Entity
530+
* @InheritanceType("SINGLE_TABLE")
531+
* @DiscriminatorColumn(
532+
* name="type",
533+
* type="string",
534+
* length=null,
535+
* ),
536+
* @DiscriminatorMap({"s"="SuperEntity", "c"="ChildEntity"})
537+
*/
538+
class DiscriminatorColumnWithNullLength
539+
{
540+
/**
541+
* @var int
542+
* @Id
543+
* @Column
544+
*/
545+
public $id;
546+
}

0 commit comments

Comments
 (0)