1
0
mirror of synced 2025-02-03 22:09:26 +03:00

146 lines
4.4 KiB
PHP
Raw Normal View History

2017-03-04 15:09:29 +01:00
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\Tests\OrmFunctionalTestCase;
2017-03-04 15:09:29 +01:00
/**
* @group #6303
2017-03-04 15:09:29 +01:00
*/
class DDC6303Test extends OrmFunctionalTestCase
2017-03-04 15:09:29 +01:00
{
public function setUp()
{
parent::setUp();
2017-03-11 20:37:32 +01:00
try {
$this->_schemaTool->createSchema([
2017-03-11 20:37:32 +01:00
$this->_em->getClassMetadata(DDC6303Contract::class),
$this->_em->getClassMetadata(DDC6303ContractA::class),
$this->_em->getClassMetadata(DDC6303ContractB::class),
]);
} catch (SchemaException $ignored) {
}
2017-03-04 15:09:29 +01:00
}
2017-03-04 15:09:29 +01:00
public function testMixedTypeHydratedCorrectlyInJoinedInheritance()
{
$contractA = new DDC6303ContractA();
$contractAData = 'authorized';
2017-03-04 15:09:29 +01:00
$contractA->originalData = $contractAData;
$contractB = new DDC6303ContractB();
//contractA and contractB have an inheritance from Contract, but one has a string originalData and the second has an array
$contractBData = ['accepted', 'authorized'];
2017-03-04 15:09:29 +01:00
$contractB->originalData = $contractBData;
$this->_em->persist($contractA);
$this->_em->persist($contractB);
$this->_em->flush();
2017-03-04 15:09:29 +01:00
// clear entity manager so that $repository->find actually fetches them and uses the hydrator
// instead of just returning the existing managed entities
$this->_em->clear();
$repository = $this->_em->getRepository(DDC6303Contract::class);
2017-03-04 15:09:29 +01:00
$dataMap = [
$contractA->id => $contractAData,
$contractB->id => $contractBData,
];
$contracts = $repository
->createQueryBuilder('p')
->where('p.id IN(:ids)')
->setParameter('ids', array_keys($dataMap))
->getQuery()->getResult();
2017-03-04 15:09:29 +01:00
foreach ($contracts as $contract) {
static::assertEquals(
$contract->originalData,
$dataMap[$contract->id],
'contract ' . get_class($contract) . ' not equals to original'
);
2017-03-04 15:09:29 +01:00
}
}
2017-03-04 15:27:02 +01:00
public function testEmptyValuesInJoinedInheritance()
2017-03-04 15:27:02 +01:00
{
$contractStringEmptyData = '';
$contractStringZeroData = 0;
$contractArrayEmptyData = [];
2017-03-04 15:27:02 +01:00
$contractStringEmpty = new DDC6303ContractA();
$contractStringZero = new DDC6303ContractA();
$contractArrayEmpty = new DDC6303ContractB();
2017-03-04 15:27:02 +01:00
$contractStringEmpty->originalData = $contractStringEmptyData;
$contractStringZero->originalData = $contractStringZeroData;
$contractArrayEmpty->originalData = $contractArrayEmptyData;
2017-03-04 15:27:02 +01:00
$this->_em->persist($contractStringZero);
$this->_em->persist($contractStringEmpty);
$this->_em->persist($contractArrayEmpty);
$this->_em->flush();
2017-03-04 15:27:02 +01:00
// clear entity manager so that $repository->find actually fetches them and uses the hydrator
// instead of just returning the existing managed entities
$this->_em->clear();
$repository = $this->_em->getRepository(DDC6303Contract::class);
$dataMap = [
$contractStringZero->id => $contractStringZeroData,
2017-03-04 15:27:02 +01:00
$contractStringEmpty->id => $contractStringEmptyData,
$contractArrayEmpty->id => $contractArrayEmptyData,
];
2017-03-04 15:27:02 +01:00
$contracts = $repository
->createQueryBuilder('p')
2017-03-04 15:27:02 +01:00
->where('p.id IN(:ids)')
->setParameter('ids', array_keys($dataMap))
->getQuery()
->getResult();
foreach ($contracts as $contract) {
static::assertEquals(
$contract->originalData,
$dataMap[$contract->id],
'contract ' . get_class($contract) . ' not equals to original'
);
2017-03-04 15:27:02 +01:00
}
}
2017-03-04 15:09:29 +01:00
}
2017-03-11 20:37:32 +01:00
/**
* @Entity
* @Table
2017-03-11 20:37:32 +01:00
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({
* "contract" = "DDC6303Contract",
* "contract_b" = "DDC6303ContractB",
* "contract_a" = "DDC6303ContractA"
* })
*/
class DDC6303Contract
{
/** @Id @Column(type="integer") @GeneratedValue */
2017-03-11 20:37:32 +01:00
public $id;
}
/** @Entity @Table */
2017-03-11 20:37:32 +01:00
class DDC6303ContractA extends DDC6303Contract
{
/** @Column(type="string", nullable=true) */
2017-03-11 20:37:32 +01:00
public $originalData;
}
/** @Entity @Table */
2017-03-11 20:37:32 +01:00
class DDC6303ContractB extends DDC6303Contract
{
/** @Column(type="simple_array", nullable=true) */
2017-03-11 20:37:32 +01:00
public $originalData;
}