1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
<?php
declare(strict_types=1);
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types as DBALTypes;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Table;
use Doctrine\Tests\OrmFunctionalTestCase;
/**
* This test verifies that custom post-insert identifiers respect type conversion semantics.
* The generated identifier must be converted via DBAL types before populating the entity
* identifier field.
*
* @group 5935 5684 6020 6152
*/
class DDC5684Test extends OrmFunctionalTestCase
{
protected function setUp(): void
{
parent::setUp();
if (DBALTypes\Type::hasType(DDC5684ObjectIdType::class)) {
DBALTypes\Type::overrideType(DDC5684ObjectIdType::class, DDC5684ObjectIdType::class);
} else {
DBALTypes\Type::addType(DDC5684ObjectIdType::class, DDC5684ObjectIdType::class);
}
$this->createSchemaForModels(DDC5684Object::class);
}
public function testAutoIncrementIdWithCustomType(): void
{
$object = new DDC5684Object();
$this->_em->persist($object);
$this->_em->flush();
self::assertInstanceOf(DDC5684ObjectId::class, $object->id);
}
public function testFetchObjectWithAutoIncrementedCustomType(): void
{
$object = new DDC5684Object();
$this->_em->persist($object);
$this->_em->flush();
$this->_em->clear();
$rawId = $object->id->value;
$object = $this->_em->find(DDC5684Object::class, new DDC5684ObjectId($rawId));
self::assertInstanceOf(DDC5684ObjectId::class, $object->id);
self::assertEquals($rawId, $object->id->value);
}
}
class DDC5684ObjectIdType extends DBALTypes\Type
{
/**
* {@inheritDoc}
*/
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return new DDC5684ObjectId($value);
}
/**
* {@inheritDoc}
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return $value->value;
}
/**
* {@inheritDoc}
*/
public function getName()
{
return self::class;
}
/**
* {@inheritDoc}
*/
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
return $platform->getIntegerTypeDeclarationSQL($column);
}
}
class DDC5684ObjectId
{
/** @var mixed */
public $value;
/** @param mixed $value */
public function __construct($value)
{
$this->value = $value;
}
public function __toString(): string
{
return (string) $this->value;
}
}
/**
* @Entity
* @Table(name="ticket_5684_objects")
*/
class DDC5684Object
{
/**
* @var DDC5684ObjectIdType
* @Id
* @Column(type=DDC5684ObjectIdType::class)
* @GeneratedValue(strategy="AUTO")
*/
public $id;
}
|