123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- <?php
-
- namespace Doctrine\Tests\ORM\Functional;
-
- use Doctrine\ORM\Mapping\ClassMetadata;
-
- require_once __DIR__ . '/../../TestInit.php';
-
- class SingleTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase
- {
- private $salesPerson;
- private $engineers = array();
- private $fix;
- private $flex;
- private $ultra;
-
- public function setUp()
- {
- $this->useModelSet('company');
- parent::setUp();
- }
-
- public function persistRelatedEmployees()
- {
- $this->salesPerson = new \Doctrine\Tests\Models\Company\CompanyEmployee();
- $this->salesPerson->setName('Poor Sales Guy');
- $this->salesPerson->setDepartment('Sales');
- $this->salesPerson->setSalary(100);
-
- $engineer1 = new \Doctrine\Tests\Models\Company\CompanyEmployee();
- $engineer1->setName('Roman B.');
- $engineer1->setDepartment('IT');
- $engineer1->setSalary(100);
- $this->engineers[] = $engineer1;
-
- $engineer2 = new \Doctrine\Tests\Models\Company\CompanyEmployee();
- $engineer2->setName('Jonathan W.');
- $engineer2->setDepartment('IT');
- $engineer2->setSalary(100);
- $this->engineers[] = $engineer2;
-
- $engineer3 = new \Doctrine\Tests\Models\Company\CompanyEmployee();
- $engineer3->setName('Benjamin E.');
- $engineer3->setDepartment('IT');
- $engineer3->setSalary(100);
- $this->engineers[] = $engineer3;
-
- $engineer4 = new \Doctrine\Tests\Models\Company\CompanyEmployee();
- $engineer4->setName('Guilherme B.');
- $engineer4->setDepartment('IT');
- $engineer4->setSalary(100);
- $this->engineers[] = $engineer4;
-
- $this->_em->persist($this->salesPerson);
- $this->_em->persist($engineer1);
- $this->_em->persist($engineer2);
- $this->_em->persist($engineer3);
- $this->_em->persist($engineer4);
- }
-
- public function loadFullFixture()
- {
- $this->persistRelatedEmployees();
-
- $this->fix = new \Doctrine\Tests\Models\Company\CompanyFixContract();
- $this->fix->setFixPrice(1000);
- $this->fix->setSalesPerson($this->salesPerson);
- $this->fix->addEngineer($this->engineers[0]);
- $this->fix->addEngineer($this->engineers[1]);
- $this->fix->markCompleted();
-
- $this->flex = new \Doctrine\Tests\Models\Company\CompanyFlexContract();
- $this->flex->setSalesPerson($this->salesPerson);
- $this->flex->setHoursWorked(100);
- $this->flex->setPricePerHour(100);
- $this->flex->addEngineer($this->engineers[2]);
- $this->flex->addEngineer($this->engineers[1]);
- $this->flex->addEngineer($this->engineers[3]);
- $this->flex->markCompleted();
-
- $this->ultra = new \Doctrine\Tests\Models\Company\CompanyFlexUltraContract();
- $this->ultra->setSalesPerson($this->salesPerson);
- $this->ultra->setHoursWorked(150);
- $this->ultra->setPricePerHour(150);
- $this->ultra->setMaxPrice(7000);
- $this->ultra->addEngineer($this->engineers[3]);
- $this->ultra->addEngineer($this->engineers[0]);
-
- $this->_em->persist($this->fix);
- $this->_em->persist($this->flex);
- $this->_em->persist($this->ultra);
- $this->_em->flush();
- $this->_em->clear();
- }
-
- public function testPersistChildOfBaseClass()
- {
- $this->persistRelatedEmployees();
-
- $fixContract = new \Doctrine\Tests\Models\Company\CompanyFixContract();
- $fixContract->setFixPrice(1000);
- $fixContract->setSalesPerson($this->salesPerson);
-
- $this->_em->persist($fixContract);
- $this->_em->flush();
- $this->_em->clear();
-
- $contract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyFixContract', $fixContract->getId());
-
- $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyFixContract', $contract);
- $this->assertEquals(1000, $contract->getFixPrice());
- $this->assertEquals($this->salesPerson->getId(), $contract->getSalesPerson()->getId());
- }
-
- public function testPersistDeepChildOfBaseClass()
- {
- $this->persistRelatedEmployees();
-
- $ultraContract = new \Doctrine\Tests\Models\Company\CompanyFlexUltraContract();
- $ultraContract->setSalesPerson($this->salesPerson);
- $ultraContract->setHoursWorked(100);
- $ultraContract->setPricePerHour(50);
- $ultraContract->setMaxPrice(7000);
-
- $this->_em->persist($ultraContract);
- $this->_em->flush();
- $this->_em->clear();
-
- $contract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyFlexUltraContract', $ultraContract->getId());
-
- $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyFlexUltraContract', $contract);
- $this->assertEquals(7000, $contract->getMaxPrice());
- $this->assertEquals(100, $contract->getHoursWorked());
- $this->assertEquals(50, $contract->getPricePerHour());
- }
-
- public function testChildClassLifecycleUpdate()
- {
- $this->loadFullFixture();
-
- $fix = $this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->fix->getId());
- $fix->setFixPrice(2500);
-
- $this->_em->flush();
- $this->_em->clear();
-
- $newFix = $this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->fix->getId());
- $this->assertEquals(2500, $newFix->getFixPrice());
- }
-
- public function testChildClassLifecycleRemove()
- {
- $this->loadFullFixture();
-
- $fix = $this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->fix->getId());
- $this->_em->remove($fix);
- $this->_em->flush();
-
- $this->assertNull($this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->fix->getId()));
- }
-
- public function testFindAllForAbstractBaseClass()
- {
- $this->loadFullFixture();
- $contracts = $this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyContract')->findAll();
-
- $this->assertEquals(3, count($contracts));
- $this->assertContainsOnly('Doctrine\Tests\Models\Company\CompanyContract', $contracts);
- }
-
- public function testFindAllForChildClass()
- {
- $this->loadFullFixture();
-
- $this->assertEquals(1, count($this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyFixContract')->findAll()));
- $this->assertEquals(2, count($this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyFlexContract')->findAll()));
- $this->assertEquals(1, count($this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyFlexUltraContract')->findAll()));
- }
-
- public function testFindForAbstractBaseClass()
- {
- $this->loadFullFixture();
-
- $contract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->fix->getId());
-
- $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyFixContract', $contract);
- $this->assertEquals(1000, $contract->getFixPrice());
- }
-
- public function testQueryForAbstractBaseClass()
- {
- $this->loadFullFixture();
-
- $contracts = $this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\Company\CompanyContract c')->getResult();
-
- $this->assertEquals(3, count($contracts));
- $this->assertContainsOnly('Doctrine\Tests\Models\Company\CompanyContract', $contracts);
- }
-
- public function testQueryForChildClass()
- {
- $this->loadFullFixture();
-
- $this->assertEquals(1, count($this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\Company\CompanyFixContract c')->getResult()));
- $this->assertEquals(2, count($this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\Company\CompanyFlexContract c')->getResult()));
- $this->assertEquals(1, count($this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\Company\CompanyFlexUltraContract c')->getResult()));
- }
-
- public function testQueryBaseClassWithJoin()
- {
- $this->loadFullFixture();
-
- $contracts = $this->_em->createQuery('SELECT c, p FROM Doctrine\Tests\Models\Company\CompanyContract c JOIN c.salesPerson p')->getResult();
- $this->assertEquals(3, count($contracts));
- $this->assertContainsOnly('Doctrine\Tests\Models\Company\CompanyContract', $contracts);
- }
-
- public function testQueryScalarWithDiscrimnatorValue()
- {
- $this->loadFullFixture();
-
- $contracts = $this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\Company\CompanyContract c ORDER BY c.id')->getScalarResult();
-
- $discrValues = \array_map(function($a) {
- return $a['c_discr'];
- }, $contracts);
-
- sort($discrValues);
-
- $this->assertEquals(array('fix', 'flexible', 'flexultra'), $discrValues);
- }
-
- public function testQueryChildClassWithCondition()
- {
- $this->loadFullFixture();
-
- $dql = 'SELECT c FROM Doctrine\Tests\Models\Company\CompanyFixContract c WHERE c.fixPrice = ?1';
- $contract = $this->_em->createQuery($dql)->setParameter(1, 1000)->getSingleResult();
-
- $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyFixContract', $contract);
- $this->assertEquals(1000, $contract->getFixPrice());
- }
-
- public function testUpdateChildClassWithCondition()
- {
- $this->loadFullFixture();
-
- $dql = 'UPDATE Doctrine\Tests\Models\Company\CompanyFlexContract c SET c.hoursWorked = c.hoursWorked * 2 WHERE c.hoursWorked = 150';
- $affected = $this->_em->createQuery($dql)->execute();
-
- $this->assertEquals(1, $affected);
-
- $flexContract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->flex->getId());
- $ultraContract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyContract', $this->ultra->getId());
-
- $this->assertEquals(300, $ultraContract->getHoursWorked());
- $this->assertEquals(100, $flexContract->getHoursWorked());
- }
-
- public function testUpdateBaseClassWithCondition()
- {
- $this->loadFullFixture();
-
- $dql = 'UPDATE Doctrine\Tests\Models\Company\CompanyContract c SET c.completed = true WHERE c.completed = false';
- $affected = $this->_em->createQuery($dql)->execute();
-
- $this->assertEquals(1, $affected);
-
- $dql = 'UPDATE Doctrine\Tests\Models\Company\CompanyContract c SET c.completed = false';
- $affected = $this->_em->createQuery($dql)->execute();
-
- $this->assertEquals(3, $affected);
- }
-
- public function testDeleteByChildClassCondition()
- {
- $this->loadFullFixture();
-
- $dql = 'DELETE Doctrine\Tests\Models\Company\CompanyFlexContract c';
- $affected = $this->_em->createQuery($dql)->execute();
-
- $this->assertEquals(2, $affected);
- }
-
- public function testDeleteByBaseClassCondition()
- {
- $this->loadFullFixture();
-
- $dql = "DELETE Doctrine\Tests\Models\Company\CompanyContract c WHERE c.completed = true";
- $affected = $this->_em->createQuery($dql)->execute();
-
- $this->assertEquals(2, $affected);
-
- $contracts = $this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\Company\CompanyContract c')->getResult();
- $this->assertEquals(1, count($contracts));
-
- $this->assertFalse($contracts[0]->isCompleted(), "Only non completed contracts should be left.");
- }
-
- /**
- * @group DDC-130
- */
- public function testDeleteJoinTableRecords()
- {
- $this->loadFullFixture();
-
- // remove managed copy of the fix contract
- $this->_em->remove($this->_em->find(get_class($this->fix), $this->fix->getId()));
- $this->_em->flush();
-
- $this->assertNull($this->_em->find(get_class($this->fix), $this->fix->getId()), "Contract should not be present in the database anymore.");
- }
-
- /**
- * @group DDC-817
- */
- public function testFindByAssociation()
- {
- $this->loadFullFixture();
-
- $repos = $this->_em->getRepository("Doctrine\Tests\Models\Company\CompanyContract");
- $contracts = $repos->findBy(array('salesPerson' => $this->salesPerson->getId()));
- $this->assertEquals(3, count($contracts), "There should be 3 entities related to " . $this->salesPerson->getId() . " for 'Doctrine\Tests\Models\Company\CompanyContract'");
-
- $repos = $this->_em->getRepository("Doctrine\Tests\Models\Company\CompanyFixContract");
- $contracts = $repos->findBy(array('salesPerson' => $this->salesPerson->getId()));
- $this->assertEquals(1, count($contracts), "There should be 1 entities related to " . $this->salesPerson->getId() . " for 'Doctrine\Tests\Models\Company\CompanyFixContract'");
-
- $repos = $this->_em->getRepository("Doctrine\Tests\Models\Company\CompanyFlexContract");
- $contracts = $repos->findBy(array('salesPerson' => $this->salesPerson->getId()));
- $this->assertEquals(2, count($contracts), "There should be 2 entities related to " . $this->salesPerson->getId() . " for 'Doctrine\Tests\Models\Company\CompanyFlexContract'");
-
- $repos = $this->_em->getRepository("Doctrine\Tests\Models\Company\CompanyFlexUltraContract");
- $contracts = $repos->findBy(array('salesPerson' => $this->salesPerson->getId()));
- $this->assertEquals(1, count($contracts), "There should be 1 entities related to " . $this->salesPerson->getId() . " for 'Doctrine\Tests\Models\Company\CompanyFlexUltraContract'");
- }
-
- /**
- * @group DDC-834
- */
- public function testGetReferenceEntityWithSubclasses()
- {
- $this->loadFullFixture();
-
- $ref = $this->_em->getReference('Doctrine\Tests\Models\Company\CompanyContract', $this->fix->getId());
- $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $ref, "Cannot Request a proxy from a class that has subclasses.");
- $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyContract', $ref);
- $this->assertInstanceOf('Doctrine\Tests\Models\Company\CompanyFixContract', $ref, "Direct fetch of the reference has to load the child class Emplyoee directly.");
- $this->_em->clear();
-
- $ref = $this->_em->getReference('Doctrine\Tests\Models\Company\CompanyFixContract', $this->fix->getId());
- $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $ref, "A proxy can be generated only if no subclasses exists for the requested reference.");
- }
-
- /**
- * @group DDC-952
- */
- public function testEagerLoadInheritanceHierachy()
- {
- $this->loadFullFixture();
-
- $dql = 'SELECT f FROM Doctrine\Tests\Models\Company\CompanyFixContract f WHERE f.id = ?1';
- $contract = $this->_em->createQuery($dql)
- ->setFetchMode('Doctrine\Tests\Models\Company\CompanyFixContract', 'salesPerson', ClassMetadata::FETCH_EAGER)
- ->setParameter(1, $this->fix->getId())
- ->getSingleResult();
-
- $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $contract->getSalesPerson());
- }
- }
|