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的小片段

基本思想是这样的:

男人和女人有一些共同的逻辑和个人的逻辑。例如登录。男性和女性需要一个电子邮件和一个密码才能登录。由于两次实现相同的登录逻辑是多余的,我想创建一个更抽象的类,即User,我想在其中放置适用于男性和女性的所有内容,例如姓名、电子邮件、密码、登录逻辑等...

这就是教义变得棘手的地方。男性和女性将有单独的字段存储在数据库中,但他们仍然需要他们的“公共数据”(姓名、密码等......),所以一个简单的class Man extends User可能无法正常工作。User我存储了男女对应的id 。所以有一个标识。

我的想法是,如果我这样做$men->getPassword()应该使用getPassword()相应User对象的功能。

我希望我清除了我的意图。

亲切的问候,感谢您的挖掘。

4

1 回答 1

2

我曾经在我的一个项目中完成了您正在寻找的事情,在代码方面做得不太好,但映射很好;)请检查此链接

  • Item.php.dist 将是您的用户实体
  • (Property|Vehicle).php.dist 将是您的男人/女人实体
  • 请注意,代码示例中缺少属性鉴别器映射。我在应用程序中做的不同;)

最终,您不希望在 SQL Server 上拥有单独的“表”。它都属于超类“用户”,因此属于用户表。您将扩展 UserTable 并使用 DiscriminatorMapping 映射特定实体。

注意:一个男人不能被编辑成一个女人!你必须杀死那个男人并生下一个女人:P

想象一下这个模型:

User
  *id
  -name
  -surname

Man extends User
  -pc_power

Woman extends User
  -nail_color

您的 DB-Schema 将如下所示:

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)

现在在 Doctrines 方面,你对 USER-Entity 进行查询

$entity = $userRepository->find(1);
echo get_class($entity); // returns "Man"

$entity = $userRepository->find(2);
echo get_class($entity); // returns "Woman"

这会让事情更清楚吗,否则我根本无法帮助你:P

于 2013-10-13T11:37:02.080 回答