学说实体扩展另一个实体


Doctrine Entity extending another Entity

嗨,我 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()它应该使用相应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