Doctrine单表继承 - 多对多关联不起作用

时间:2016-12-25 15:33:39

标签: inheritance doctrine-orm doctrine symfony single-table-inheritance

我有不同类型的用户包含不同的属性,即

 1. Customer, fields=[name, email]
 2. Professional, fields=[name, email, region, locations, categories, timeslots]
 3. Admin, fields=[name, email]

我预计稍后会添加其他类型的用户。我正在使用doctrine的单表继承,这是我的类。

1。 user.php的     

namespace UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\Table(name="user")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"user" = "UserBundle\Entity\User", "customer"="UserBundle\Entity\Customer", "professional"="UserBundle\Entity\Professional", "admin"="UserBundle\Entity\Admin"})
 * @ORM\Entity(repositoryClass="UserBundle\Entity\UserRepository")
 */
class User implements UserInterface
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     */
    private $name;

    /**
     * @ORM\Column(name="email", type="string", length=100, unique=true, nullable=false)
     */
    private $email;
}

2。 Professional.php

<?php

namespace UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use UserBundle\Entity\User;

/**
 * @ORM\Entity
 */
class Professional extends User
{
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Region", inversedBy="professionals", cascade={"persist"})
     * @ORM\JoinColumn(name="region_id", referencedColumnName="id", unique=false, nullable=true)
     */
    private $region;

    /* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Location")
     * @ORM\JoinTable(name="professional_location",
     *      joinColumns={@ORM\JoinColumn(name="professional_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="location_id", referencedColumnName="id", unique=false)}
     * )
     */
    private $locations;

    /* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category")
     * @ORM\JoinTable(name="professional_category",
     *      joinColumns={@ORM\JoinColumn(name="professional_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", unique=false)}
     * )
     */
    private $categories;

    /**
     * @ORM\OneToMany(targetEntity="UserBundle\Entity\Timeslot", mappedBy="professional", cascade={"persist"})
     */
    private $timeslots;

第3。 Customer.php

<?php

namespace UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use UserBundle\Entity\User;

/**
 * @ORM\Entity
 */
class Customer extends User
{
    public function getRoles()
    {
        return ['ROLE_CUSTOMER'];
    }
}

问题是,当我创建架构时,它会忽略Professional Entity中关联的创建,例如,不会创建位置和类别的表,但区域关联可以正常工作。

我知道我可以使用@MappedSuperclass,这种方法的问题是重复,这会创建3个具有相似列的表,我试图避免这种情况。

如何在doctrine2中使多对多关联与单表继承一起使用。

谢谢你。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,似乎是用于多对多语法的问题,上面的语法没有继承,但是没有继承,因此我将其更改为Professional.php中的跟随

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Location", inversedBy="professionals", cascade={"persist"})
 * @ORM\JoinColumn(name="location_id", referencedColumnName="id", unique=false, nullable=true)
 */
protected $locations;

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category", inversedBy="professionals", cascade={"persist"})
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id", unique=false, nullable=true)
 */
protected $categories;

它创建了具有多对多关联的professional_locationprofessional_category表。