Skip to content

Commit

Permalink
Merge pull request #6485 from elt/versionWithCustomTypePrimaryKey
Browse files Browse the repository at this point in the history
#5804 Versioning doesn't work with a custom type primary key
  • Loading branch information
lcobucci authored Jul 22, 2017
2 parents 1d8c7f9 + 6bf9f6f commit 9826d9c
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 1 deletion.
19 changes: 18 additions & 1 deletion lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php
Original file line number Diff line number Diff line change
Expand Up @@ -344,13 +344,30 @@ protected function fetchVersionValue($versionedClass, array $id)
. ' FROM ' . $tableName
. ' WHERE ' . implode(' = ? AND ', $identifier) . ' = ?';


$flatId = $this->identifierFlattener->flattenIdentifier($versionedClass, $id);

$value = $this->conn->fetchColumn($sql, array_values($flatId));
$value = $this->conn->fetchColumn(
$sql,
array_values($flatId),
0,
$this->extractIdentifierTypes($id, $versionedClass)
);

return Type::getType($fieldMapping['type'])->convertToPHPValue($value, $this->platform);
}

private function extractIdentifierTypes(array $id, ClassMetadata $versionedClass) : array
{
$types = [];

foreach ($id as $field => $value) {
$types = array_merge($types, $this->getTypes($field, $value, $versionedClass));
}

return $types;
}

/**
* {@inheritdoc}
*/
Expand Down
108 changes: 108 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/GH5804Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?php

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Doctrine\Tests\OrmFunctionalTestCase;

/**
* @group 5804
*/
final class GH5804Test extends OrmFunctionalTestCase
{
protected function setUp()
{
parent::setUp();

Type::addType(GH5804Type::NAME, GH5804Type::class);

$this->_schemaTool->createSchema(
[$this->_em->getClassMetadata(GH5804Article::class)]
);
}

public function testTextColumnSaveAndRetrieve2()
{
$firstArticle = new GH5804Article;
$firstArticle->text = 'Max';
$this->_em->persist($firstArticle);
$this->_em->flush();

self::assertSame(1, $firstArticle->version);

$firstArticle->text = 'Moritz';
$this->_em->persist($firstArticle);
$this->_em->flush();

self::assertSame(2, $firstArticle->version);
}
}

final class GH5804Generator extends AbstractIdGenerator
{
/**
* {@inheritdoc}
*/
public function generate(EntityManager $em, $entity)
{
return 'test5804';
}
}

final class GH5804Type extends Type
{
const NAME = 'GH5804Type';

public function getName()
{
return self::NAME;
}

/**
* {@inheritdoc}
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return $platform->getVarcharTypeDeclarationSQL($fieldDeclaration);
}

/**
* {@inheritdoc}
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (empty($value)) {
return null;
}

return 'testGh5804DbValue';
}
}

/**
* @Entity
*/
class GH5804Article
{
/**
* @Id
* @Column(type="GH5804Type")
* @GeneratedValue(strategy="CUSTOM")
* @CustomIdGenerator(class=\Doctrine\Tests\ORM\Functional\Ticket\GH5804Generator::class)
*/
public $id;

/**
* @Version
* @Column(type="integer")
*/
public $version;

/**
* @Column(type="text")
*/
public $text;
}

0 comments on commit 9826d9c

Please sign in to comment.