2012-05-01 4 views
6

Я ищу решение для следующей проблемы с наследованием базы данных, используя Doctrine 2, встроенную в структуру Symfony 2. Это то, что я хочу сделать ...Symfony 2 + Doctrine 2 + inheritance

enter image description here

Я хочу создать две таблицы (UredniHodiny, KonzultacniHodiny) с тем же интерфейсом, как абстрактный класс Hodiny. Это, как я пытаюсь сделать это

<?php 

// src/CvutPWT/ImportBundle/Entity/Hodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Hodiny 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Osoba") 
    */ 
    protected $osoba; 

    /** 
    * @ORM\ManyToOne(targetEntity="Mistnost") 
    */ 
    protected $mistnost; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $zacatek; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $konec; 

} 


<?php 

// src/CvutPWT/ImportBundle/Entity/KonzultacniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="konzultacnihodiny") 
*/ 
class KonzultacniHodiny extends Hodiny 
{ 

} 

<?php 

// src/CvutPWT/ImportBundle/Entity/UredniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="urednihodiny") 
*/ 
class UredniHodiny extends Hodiny 
{ 

} 

Теперь, когда я бегу php app/console doctrine:generate:entities CvutPWTImportBundle Symfony создает все переменные (точнее столбцов) из класса Hodiny как частные переменные для обоих дочерних классов. Теперь, когда я пытаюсь создать эти таблицы с app/console doctrine:schema:update --force, я получаю ошибки, которые $id must be protected or weaker. Когда я меняю эту защиту вручную, я могу создавать таблицы, но есть только один столбец (id). Но это не то, на что я надеялся. Может кто-нибудь дать мне какой-нибудь совет, что я делаю неправильно?

+0

Эй, это работает, как и ожидалось для меня. Я получаю таблицу под названием «консултакниходины» и таблицу под названием «urednihodiny», которые содержат 5 полей. Примечание. Мне также необходимо добавить два других объекта, поскольку они в настоящее время являются FK в базовом классе Hodiny. Вы также должны подтвердить, что [тип наследования] (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html), который вы хотите использовать так как их больше одного. – Shane

ответ

8

Это не наследование таблицы. Отображаемые супер-классы - это просто отображение наследования. Таблицы, соответствующие вашим конечным объектам, не будут связаны друг с другом каким-либо образом.

Если вы хотите реальную таблицу наследования (одна таблица или присоединяемой таблицы), используйте: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

Если вы все еще хотите использовать отображенные супер классов, то вы должны поставить @ORM\Id определение в обоих конечных классов. Вы можете не введите идентификаторы в отображаемых суперклассов.

Смежные вопросы