我们可以扩展 Doctrine 中的实体吗?

Can we extend entities in Doctrine?

我正在使用 Doctrine 进行我的第一个项目,我偶然发现了这个。

  1. 我有一个实体用户,它是一个映射的超级 class。

    /**
     * @ORM\MappedSuperclass
     */
     abstract class User
     {
       /**
        * @var int
        */
       protected $id;
    
       /**
        * @var string
        */
       protected $name;
    
       /**
        * @ORM\Embedded(class="AppBundle\Entity\Person")
        * @var Person
        */
       protected $person;
    
       /**
        * @var Authors[]|Collection|Selectable
        */
       protected $authors;
     }
    

我从上面的用户实体创建了一个作者实体

    class Author extends User
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         * @var int
         */
        protected $id;

        /**
         * @ORM\JoinColumn(name="publisher_id", referencedColumnName="id", nullable=false, unique=true)
         * @ORM\OneToOne(targetEntity="AppBundle\Entity\Publisher", inversedBy="book")
         * @var Publisher
         */
        protected $publisher;

        /**
         * @ORM\OneToMany(targetEntity="AppBundle\Entity\Publisher", mappedBy="author")
         * @var Approval[]|Collection|Selectable
         */
        protected $approvals;

    }
  1. 我使用 Author 实体创建对象实体 Book

    /**
     * @ORM\Entity
     * @ORM\Table(name="magazine", options={"collate":"utf8_general_ci"})
     */
    class Book
    {
       /**
        * @ORM\Id
        * @ORM\Column(type="integer")
        * @ORM\GeneratedValue(strategy="AUTO")
        * @var int
        */
       protected $id;
    
       /**
        * @ORM\JoinColumn(name="publisher_id", referencedColumnName="id", nullable=false, unique=true)
        * @ORM\OneToOne(targetEntity="AppBundle\Entity\Publisher", inversedBy="book")
        * @var Publisher
        */
       protected $publisher;
    }
    

我的 Publisher 实体如下:

    /**
     * @ORM\Entity
     * @ORM\Table(name="ops_approval", options={"collate":"utf8_general_ci"})
     */
    class Publisher
    {
       /**
        * @ORM\Id
        * @ORM\Column(type="integer")
        * @ORM\GeneratedValue(strategy="AUTO")
        * @var int
        */
       protected $id;

       /**
        * @ORM\Column(type="datetime", nullable=false)
        */
       protected $createdAt;

       /**
        * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Author", inversedBy="authors")
        * @ORM\JoinColumn(name="author_id", referencedColumnName="id")
        */
       protected $author;

       /**
        * @ORM\OneToMany(targetEntity="AppBundle\Entity\Book", mappedBy="book"
        */
       protected $book;
    }
  1. 现在,我可以扩展已发布的实体来创建图书实体吗

    /**
     * @ORM\Entity
     * @ORM\Table(name="book", options={"collate":"utf8_general_ci"})
     */
    class Book extends Magazine
    {
       /**
        * @ORM\Id
        * @ORM\Column(type="integer")
        * @ORM\GeneratedValue(strategy="AUTO")
        * @var int
        */
       protected $id;
    
       /**
        * @ORM\JoinColumn(name="published_id", referencedColumnName="id", nullable=false, unique=true)
         * @ORM\OneToOne(targetEntity="AppBundle\Entity\Publisher", inversedBy="book")
         * @var Publisher
         */
        protected $publisher;
    }
    

使用特征而不是继承。

如果需要,您还可以覆盖一些映射:
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/tutorials/override-field-association-mappings-in-subclasses.html