嗨,我读了这篇文章http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html但我不确定如何完成以下操作:
我有一个“用户”表、一个“男人”表和一个“女人”表。我想要我的 php 类Man
并Woman
扩展User
对象。
注释映射:
namespace Core\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="email_UNIQUE", columns={"email"}), @ORM\UniqueConstraint(name="username_UNIQUE", columns={"username"})})
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="first_name", type="string", length=255, nullable=true)
*/
private $firstName;
/**
* @var string
*
* @ORM\Column(name="middle_name", type="string", length=255, nullable=true)
*/
private $middleName;
/**
* @var string
*
* @ORM\Column(name="last_name", type="string", length=255, nullable=true)
*/
private $lastName;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=255, nullable=false)
*/
private $username;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=255, nullable=false)
*/
private $email;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255, nullable=false)
*/
private $password;
/**
* @var \DateTime
*
* @ORM\Column(name="created_at", type="datetime", nullable=true)
*/
private $createdAt;
/**
* @var \DateTime
*
* @ORM\Column(name="updated_at", type="datetime", nullable=false)
*/
private $updatedAt;
/**
* @var \DateTime
*
* @ORM\Column(name="last_login", type="datetime", nullable=false)
*/
private $lastLogin;
/**
* @var string
*
* @ORM\Column(name="login_hash", type="string", length=255, nullable=true)
*/
private $loginHash;
/**
* @var boolean
*
* @ORM\Column(name="is_premium", type="boolean", nullable=false)
*/
private $isPremium = '0';
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Core\Entity\Bill", inversedBy="user")
* @ORM\JoinTable(name="user_has_bill",
* joinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="bill_id", referencedColumnName="id")
* }
* )
*/
private $bill;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Core\Entity\Picture", inversedBy="user")
* @ORM\JoinTable(name="user_has_picture",
* joinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="picture_id", referencedColumnName="id")
* }
* )
*/
private $picture;
/**
* Constructor
*/
public function __construct()
{
$this->bill = new \Doctrine\Common\Collections\ArrayCollection();
$this->picture = new \Doctrine\Common\Collections\ArrayCollection();
}
}
女士:
namespace Core\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Woman
*
* @ORM\Table(name="woman", indexes={@ORM\Index(name="fk_woman_user1_idx", columns={"user_id"})})
* @ORM\Entity
*/
class Woman
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $id;
/**
* @var \Core\Entity\User
*
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
* @ORM\OneToOne(targetEntity="Core\Entity\User")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $user;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Core\Entity\Cart", inversedBy="woman")
* @ORM\JoinTable(name="woman_has_cart",
* joinColumns={
* @ORM\JoinColumn(name="woman_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="cart_id", referencedColumnName="id")
* }
* )
*/
private $cart;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Core\Entity\Interest", inversedBy="woman")
* @ORM\JoinTable(name="woman_has_interest",
* joinColumns={
* @ORM\JoinColumn(name="woman_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="interest_id", referencedColumnName="id")
* }
* )
*/
private $interest;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Core\Entity\Man", inversedBy="woman")
* @ORM\JoinTable(name="woman_has_man",
* joinColumns={
* @ORM\JoinColumn(name="woman_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="man_id", referencedColumnName="id")
* }
* )
*/
private $man;
/**
* Constructor
*/
public function __construct()
{
$this->cart = new \Doctrine\Common\Collections\ArrayCollection();
$this->interest = new \Doctrine\Common\Collections\ArrayCollection();
$this->man = new \Doctrine\Common\Collections\ArrayCollection();
}
}
男人映射看起来(现在)和女人一样。
这里有一个来自 MysqlWorkbench http://s14.directupload.net/images/131013/fbg7okyn.png的小片段
基本思想是这样的:
男人和女人有一些共同的逻辑和个人的逻辑。例如登录。男性和女性需要一个电子邮件和一个密码才能登录。由于两次实现相同的登录逻辑是多余的,我想创建一个更抽象的类,即User
,我想在其中放置适用于男性和女性的所有内容,例如姓名、电子邮件、密码、登录逻辑等...
这就是教义变得棘手的地方。男性和女性将有单独的字段存储在数据库中,但他们仍然需要他们的“公共数据”(姓名、密码等......),所以一个简单的class Man extends User
可能无法正常工作。User
我存储了男女对应的id 。所以有一个标识。
我的想法是,如果我这样做$men->getPassword()
应该使用getPassword()
相应User
对象的功能。
我希望我清除了我的意图。
亲切的问候,感谢您的挖掘。