SingleTableInheritanceTest.php 5.75 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\Tests\ORM\Functional;

5 6
use Doctrine\ORM\Query;

7 8 9 10 11 12 13 14 15 16 17
require_once __DIR__ . '/../../TestInit.php';

/**
 * Functional tests for the Single Table Inheritance mapping strategy.
 *
 * @author robo
 */
class SingleTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
    protected function setUp() {
        parent::setUp();
18 19 20 21 22 23 24
        try {
            $this->_schemaTool->createSchema(array(
                $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\ParentEntity'),
                $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\ChildEntity'),
                $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\RelatedEntity')
            ));
        } catch (\Exception $e) {
25 26
            var_dump($e->getMessage());
            var_dump($e->getTraceAsString());
27
            // Swallow all exceptions. We do not test the schema tool here.
28
        }
29 30
    }

31
    public function testCRUD()
32
    {        
33 34 35
        $parent = new ParentEntity;
        $parent->setData('foobar');

romanb's avatar
romanb committed
36
        $this->_em->persist($parent);
37

38 39 40 41
        $child = new ChildEntity;
        $child->setData('thedata');
        $child->setNumber(1234);

romanb's avatar
romanb committed
42
        $this->_em->persist($child);
43 44 45 46 47

        $relatedEntity = new RelatedEntity;
        $relatedEntity->setName('theRelatedOne');
        $relatedEntity->setOwner($child);

romanb's avatar
romanb committed
48
        $this->_em->persist($relatedEntity);
49

50 51 52
        $this->_em->flush();
        $this->_em->clear();

romanb's avatar
romanb committed
53
        $query = $this->_em->createQuery("select e from Doctrine\Tests\ORM\Functional\ParentEntity e order by e.data asc");
54
        $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
55
        $entities = $query->getResult();
romanb's avatar
romanb committed
56
        
57
        $this->assertEquals(2, count($entities));
58 59
        $this->assertTrue(is_numeric($entities[0]->getId()));
        $this->assertTrue(is_numeric($entities[1]->getId()));
romanb's avatar
romanb committed
60 61
        $this->assertTrue($entities[0] instanceof ParentEntity);
        $this->assertTrue($entities[1] instanceof ChildEntity);  
62 63 64
        $this->assertEquals('foobar', $entities[0]->getData());
        $this->assertEquals('thedata', $entities[1]->getData());
        $this->assertEquals(1234, $entities[1]->getNumber());
65 66 67 68

        $this->_em->clear();

        $query = $this->_em->createQuery("select e from Doctrine\Tests\ORM\Functional\ChildEntity e");
69
        $entities = $query->getResult();
70 71 72 73 74 75 76 77 78 79
        $this->assertEquals(1, count($entities));
        $this->assertTrue($entities[0] instanceof ChildEntity);
        $this->assertTrue(is_numeric($entities[0]->getId()));
        $this->assertEquals('thedata', $entities[0]->getData());
        $this->assertEquals(1234, $entities[0]->getNumber());

        $this->_em->clear();

        $query = $this->_em->createQuery("select r,o from Doctrine\Tests\ORM\Functional\RelatedEntity r join r.owner o");

80
        $entities = $query->getResult();
81 82 83 84 85 86 87 88 89 90 91 92
        $this->assertEquals(1, count($entities));
        $this->assertTrue($entities[0] instanceof RelatedEntity);
        $this->assertTrue(is_numeric($entities[0]->getId()));
        $this->assertEquals('theRelatedOne', $entities[0]->getName());
        $this->assertTrue($entities[0]->getOwner() instanceof ChildEntity);
        $this->assertEquals('thedata', $entities[0]->getOwner()->getData());
        $this->assertSame($entities[0], $entities[0]->getOwner()->getRelatedEntity());

        $query = $this->_em->createQuery("update Doctrine\Tests\ORM\Functional\ChildEntity e set e.data = 'newdata'");

        $affected = $query->execute();
        $this->assertEquals(1, $affected);
93
        
94 95 96
        $query = $this->_em->createQuery("delete Doctrine\Tests\ORM\Functional\ParentEntity e");

        $affected = $query->execute();
97
        $this->assertEquals(2, $affected);        
98 99 100 101
    }
}

/**
102
 * @Entity
103
 * @InheritanceType("SINGLE_TABLE")
104
 * @DiscriminatorColumn(name="discr", type="string")
105
 * @DiscriminatorMap({"parent"="ParentEntity", "child"="ChildEntity"})
106 107 108
 */
class ParentEntity {
    /**
109 110
     * @Id
     * @Column(type="integer")
111
     * @GeneratedValue(strategy="AUTO")
112 113 114 115
     */
    private $id;

    /**
116
     * @Column(name="DATA", type="string")
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
     */
    private $data;

    public function getId() {
        return $this->id;
    }

    public function getData() {
        return $this->data;
    }

    public function setData($data) {
        $this->data = $data;
    }
}

/**
134
 * @Entity
135 136 137
 */
class ChildEntity extends ParentEntity {
    /**
138
     * @Column(name="`number`", type="integer", nullable=true)
139 140
     */
    private $number;
141
    /**
142 143
     * @OneToOne(targetEntity="RelatedEntity")
     * @JoinColumn(name="related_entity_id", referencedColumnName="id")
144 145
     */
    private $relatedEntity;
146 147 148 149 150 151 152 153

    public function getNumber() {
        return $this->number;
    }

    public function setNumber($number) {
        $this->number = $number;
    }
154 155 156 157 158 159 160 161 162

    public function getRelatedEntity() {
        return $this->relatedEntity;
    }

    public function setRelatedEntity($relatedEntity) {
        $this->relatedEntity = $relatedEntity;
        $relatedEntity->setOwner($this);
    }
163 164
}

165
/**
166
 * @Entity
167 168 169
 */
class RelatedEntity {
    /**
170 171
     * @Id
     * @Column(type="integer")
172
     * @GeneratedValue(strategy="AUTO")
173 174 175
     */
    private $id;
    /**
176
     * @Column(type="string", length=50)
177 178 179
     */
    private $name;
    /**
180
     * @OneToOne(targetEntity="ChildEntity", mappedBy="relatedEntity")
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
     */
    private $owner;

    public function getId() {
        return $this->id;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getOwner() {
        return $this->owner;
    }

    public function setOwner($owner) {
        $this->owner = $owner;
        if ($owner->getRelatedEntity() !== $this) {
            $owner->setRelatedEntity($this);
        }
    }
}