Doctrine2类表继承

时间:2013-09-26 08:12:35

标签: php orm doctrine-orm doctrine

我对Doctrine的文档感到有些困惑,所以也许你可以帮助我。我有以下类继承:

<?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;
}

?>

我想将每个类存储在一个单独的表中。角色通过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 个答案:

答案 0 :(得分:1)

你的问题对我来说有点混乱。

您希望使用联接表继承来定义用户的角色,但您还希望向用户添加角色属性,据我所知,该属性完全相同。好像你试图以不同的方式做同样的事情两次。

无论如何,我会尽力给你答案。

如果要为每种类型(客户,公司等)使用单独的表,您应该查看映射的超类: http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html#mapped-superclasses

通过这种方式,您可以定义将扩展它的所有实体将使用的基本类属性和关系。所有数据都将保存在每个实体的单独表中。

如果要使用Role实体定义用户的角色,您应该在用户和角色之间定义多对一关系。

祝你好运!