嗨,我 http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html 阅读了这篇文章,但我不确定如何完成以下工作:
我有一个"用户"表,一个"男人"表和一个"女人"表。我希望我的php类Man
并Woman
扩展User
对象。
注释映射:
namespace CoreEntity;
use DoctrineORMMapping as ORM;
/**
* User
*
* @ORMTable(name="user", uniqueConstraints={@ORMUniqueConstraint(name="email_UNIQUE", columns={"email"}), @ORMUniqueConstraint(name="username_UNIQUE", columns={"username"})})
* @ORMEntity
*/
class User
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="first_name", type="string", length=255, nullable=true)
*/
private $firstName;
/**
* @var string
*
* @ORMColumn(name="middle_name", type="string", length=255, nullable=true)
*/
private $middleName;
/**
* @var string
*
* @ORMColumn(name="last_name", type="string", length=255, nullable=true)
*/
private $lastName;
/**
* @var string
*
* @ORMColumn(name="username", type="string", length=255, nullable=false)
*/
private $username;
/**
* @var string
*
* @ORMColumn(name="email", type="string", length=255, nullable=false)
*/
private $email;
/**
* @var string
*
* @ORMColumn(name="password", type="string", length=255, nullable=false)
*/
private $password;
/**
* @var DateTime
*
* @ORMColumn(name="created_at", type="datetime", nullable=true)
*/
private $createdAt;
/**
* @var DateTime
*
* @ORMColumn(name="updated_at", type="datetime", nullable=false)
*/
private $updatedAt;
/**
* @var DateTime
*
* @ORMColumn(name="last_login", type="datetime", nullable=false)
*/
private $lastLogin;
/**
* @var string
*
* @ORMColumn(name="login_hash", type="string", length=255, nullable=true)
*/
private $loginHash;
/**
* @var boolean
*
* @ORMColumn(name="is_premium", type="boolean", nullable=false)
*/
private $isPremium = '0';
/**
* @var DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="CoreEntityBill", inversedBy="user")
* @ORMJoinTable(name="user_has_bill",
* joinColumns={
* @ORMJoinColumn(name="user_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="bill_id", referencedColumnName="id")
* }
* )
*/
private $bill;
/**
* @var DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="CoreEntityPicture", inversedBy="user")
* @ORMJoinTable(name="user_has_picture",
* joinColumns={
* @ORMJoinColumn(name="user_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="picture_id", referencedColumnName="id")
* }
* )
*/
private $picture;
/**
* Constructor
*/
public function __construct()
{
$this->bill = new DoctrineCommonCollectionsArrayCollection();
$this->picture = new DoctrineCommonCollectionsArrayCollection();
}
}
女人:
namespace CoreEntity;
use DoctrineORMMapping as ORM;
/**
* Woman
*
* @ORMTable(name="woman", indexes={@ORMIndex(name="fk_woman_user1_idx", columns={"user_id"})})
* @ORMEntity
*/
class Woman
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
*/
private $id;
/**
* @var CoreEntityUser
*
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
* @ORMOneToOne(targetEntity="CoreEntityUser")
* @ORMJoinColumns({
* @ORMJoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $user;
/**
* @var DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="CoreEntityCart", inversedBy="woman")
* @ORMJoinTable(name="woman_has_cart",
* joinColumns={
* @ORMJoinColumn(name="woman_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="cart_id", referencedColumnName="id")
* }
* )
*/
private $cart;
/**
* @var DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="CoreEntityInterest", inversedBy="woman")
* @ORMJoinTable(name="woman_has_interest",
* joinColumns={
* @ORMJoinColumn(name="woman_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="interest_id", referencedColumnName="id")
* }
* )
*/
private $interest;
/**
* @var DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="CoreEntityMan", inversedBy="woman")
* @ORMJoinTable(name="woman_has_man",
* joinColumns={
* @ORMJoinColumn(name="woman_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="man_id", referencedColumnName="id")
* }
* )
*/
private $man;
/**
* Constructor
*/
public function __construct()
{
$this->cart = new DoctrineCommonCollectionsArrayCollection();
$this->interest = new DoctrineCommonCollectionsArrayCollection();
$this->man = new DoctrineCommonCollectionsArrayCollection();
}
}
映射的男人看起来(目前)和女人一样。
这里有一个来自MysqlWorkbench的小片段 http://s14.directupload.net/images/131013/fbg7okyn.png
基本思想是这样的:
男人和女人有一些共同的逻辑和个人逻辑。例如登录。男性和女性需要电子邮件和密码才能登录。由于两次实现相同的登录逻辑是多余的,我想创建一个更抽象的类,User
,我想在这里放置适用于男性和女性的所有内容,如姓名、电子邮件、密码、登录逻辑等......
这就是教义变得棘手的地方。男性和女性将有单独的字段存储在数据库中,但他们仍然需要他们的"通用数据"(名称,密码等),因此简单的class Man extends User
可能无法正常工作。我将User
的相应ID存储在男性和女性身上。所以有一个识别。
我想到的是,如果我这样做$men->getPassword()
它应该使用相应User
对象的getPassword()
函数。
我希望我澄清了我的意图。
亲切的问候,感谢您的挖掘。
我曾经在我的一个项目中完成了您正在寻找的内容,它在代码方面做得不是太好,但映射很好;)请查看此链接
- item.php.dist 将是您的用户实体
- (物业|车辆).php.dist 将是您的男性/女性实体
- 请注意,代码示例中缺少属性鉴别器映射。我在应用程序;)中的做法不同
最终,您不希望在SQL Server上拥有单独的"表"。它都属于超类"用户",因此属于用户表。您将扩展用户表并使用鉴别器映射来映射特定实体。
注意:男人不能被编辑成女人!你必须杀死那个男人,生下一个女人:P
想象这个模型:
User
*id
-name
-surname
Man extends User
-pc_power
Woman extends User
-nail_color
您的数据库架构如下所示:
Table User:
*id (pk)
-discriminator (not nullable) (value: man or woman)
-name (not nullable)
-surname (not nullable)
-pc_power (nullable as far as DB is concerned)
-nail_color (nullable as far as DB is concerned)
您不需要 3 张桌子来像这样修改您的模型。这样做实际上毫无意义。它只会减慢您的查询速度。
现在,数据集可能如下所示:
A Man: (1, man, john, doe, 4ghz, null)
A Woman: (2, woman, john, doe, null, pink)
现在在教义方面,你对用户实体进行查询
$entity = $userRepository->find(1);
echo get_class($entity); // returns "Man"
$entity = $userRepository->find(2);
echo get_class($entity); // returns "Woman"
这是否使事情更加清晰,否则我根本无法帮助您:P