こんにちは、この記事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
基本的な考え方は次のとおりです。
男性と女性は、いくつかの共通の論理と個々の論理を共有しています。たとえば、ログインを取ります。男性と女性がログインするには、電子メールとパスワードが必要です。同じログイン ロジックを 2 回実装するのは冗長なので、より抽象的なクラスを作成することを考えましたUser
。名前、電子メール、パスワード、ログイン ロジックなど...
これは、教義でトリッキーになるところです。男性と女性にはデータベースに保存する個別のフィールドがありますが、それでも「共通データ」(名前、パスワードなど) が必要なため、単純な方法でclass Man extends User
は正しく機能しない可能性があります。User
オンの男性と女性の対応する id を保存します。だから身分証はある。
私が念頭に置いていたのは、対応するオブジェクトの機能を$men->getPassword()
使用する必要があるということです。getPassword()
User
私は私の意図をクリアしたことを願っています。
よろしくお願いします。掘り下げていただきありがとうございます。