0

こんにちは、この記事http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.htmlを読みましたが、次のことを達成する方法がよくわかりません。

「ユーザー」テーブル、「男性」テーブル、「女性」テーブルがあります。PHP クラスが必要で、オブジェクトManWoman拡張します。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

私は私の意図をクリアしたことを願っています。

よろしくお願いします。掘り下げていただきありがとうございます。

4

1 に答える 1