2013-09-26 3 views
0

Я немного смущен документацией Doctrine, поэтому, возможно, вы можете мне помочь. У меня есть следующее классовое наследование:Doctrine2 Наследование классов классов

<?php 

class User 
{ 
    /** 
    * @var int 
    */ 
    private $_id; 

    /** 
    * @var Role 
    */ 
    private $_role; 
} 

class Company extends User 
{ 

} 

class Customer extends User 
{ 
    ... 
} 

class Role 
{ 
    /** 
    * @var int 
    */ 
    private $_id; 
} 

?> 

Я хочу хранить каждый класс в отдельной таблице. Роль определяет тип пользователя по идентификатору. Как я могу решить эту проблему? Я пробовал:

<?php 

/** 
* @Entity 
* @Table(name="user") 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="role_id", type="integer") 
* @DiscriminatorMap({"1" = "User", "2" = "Customer"}) 
*/ 
class User 
{ 
    ... 
} 

?> 

Я не уверен, как обрабатывать класс ролей в этом сценарии.


Благодарим вас за ответ. Теперь я попытался это и получил следующую ошибку:

[Doctrine\DBAL\Schema\SchemaException] 
There is no column with name '_id' on table 'customer'. 

Я следующий код:

<?php 

/** 
* Class Sb_User 
* 
* @Entity 
* @Table(name="user") 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="role_id", type="integer") 
* @DiscriminatorMap({"2" = "Sb_Customer", "8" = "Sb_Pos"}) 
*/ 
class Sb_User implements Sb_User_Interface 
{ 
    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(name="id", type="integer") 
    * @var int 
    */ 
    protected $_id; 

    ... 
} 

/** 
* Class Sb_Customer 
* 
* @Entity 
* @EntityResult(discriminatorColumn="role_id") 
* @Table(name="customer") 
* 
*/ 
class Sb_Customer extends Sb_User implements Sb_Customer_Interface 
{ 
    .... 
} 

Я не знаю, что я делаю неправильно. Вы можете мне помочь?

?> 

ответ

1

Ваш вопрос немного запутанный для меня.

Вы хотите использовать объединенное наследование таблицы для определения роли пользователя, но также хотите добавить к своему пользователю атрибут роли, который, как я понимаю, делает то же самое. Похоже, вы пытаетесь сделать то же самое дважды по-другому.

В любом случае, я постараюсь дать вам ответ.

Если вы хотите использовать отдельные таблицы для каждого типа (Заказчик, компания и т.д.), вы должны взглянуть на отображенных суперкласса: http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html#mapped-superclasses

Таким образом, вы можете определить основные атрибуты классов и отношений, которые будут использоваться всеми объектами, которые его расширяют. Все данные будут сохранены в отдельных таблицах для каждого объекта.

Если вы хотите определить роль пользователя, использующего объект Role, вы должны определить отношение «один к одному» между пользователем и ролью.

Удачи вам!

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