原则-OneToOne关系不适用于扩展MappedSuperclass

时间:2019-03-07 08:48:27

标签: php sql doctrine-orm doctrine mappedsuperclass

我尝试使用@MappedSuperclass。它适用于简单变量(整数,字符串...)和OneToMany / ManyToOne关系。但是OneToOne关系不起作用。

我有两个具有OneToOne关系的MappedSuperclass: _SiteUser

/**
 * @MappedSuperclass _SiteUser
 *
 * @ORM\Entity(repositoryClass="_SiteModule\_Repository\_SiteUserRepository")
 * @ORM\Table(name="site_users")
 */
class _SiteUser
{
    /**
     * @var int
     * @Groups("id")
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @Groups({"username"})
     *
     * @ORM\Column(name="username", type="string", length=255, unique=true)
     */
    protected $username;

    /**
     * @var string
     * @Groups({"password"})
     *
     * @ORM\Column(name="password", type="string", length=255)
     */
    protected $password;

    /**
     * @var _SiteUserTo
     *
     * @ORM\OneToOne(targetEntity="_SiteModule\_Entity\_SiteUserTo", mappedBy="user")
     * @Gedmo\Versioned()
     */
    protected $user_to;

_SiteUserTo

/**
 * @MappedSuperclass _SiteUserTo
 *
 * @ORM\Entity(repositoryClass="_SiteModule\_Repository\_SiteUserToRepository")
 * @ORM\Table(name="users_to")
 */
class _SiteUserTo
{
    /**
     * @var int
     * @Groups("id")
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var _SiteUser
     *
     * @ORM\OneToOne(targetEntity="_SiteModule\_Entity\_SiteUser", inversedBy="user_to")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

这是我的2类,他们扩展了MappedSuperclass: SiteUser

/**
 * SiteUser
 *
 * @ORM\Entity(repositoryClass="SiteModule\Repository\SiteUserRepository")
 * @ORM\Table(name="site_users")
*/
class SiteUser extends _SiteUser
{
}

SiteUserTo

/**
 * SiteUserTo
 *
 * @ORM\Entity(repositoryClass="SiteModule\Repository\SiteUserToRepository")
 * @ORM\Table(name="users_to")
*/
class SiteUserTo extends _SiteUserTo
{
}

当我从我的MappedSuperclass(_SiteUser和_SiteUserTo)生成实体时,我得到了一个名为“ users_to”的表,其中包含id和user_id。但是,当我从其他类(SiteUser和SiteUserTo)生成实体时,它将创建具有唯一ID字段的表“ users_to”。我不知道为什么...

如果我这样更新我的SiteUser类:

/**
 * Class SiteUser
 *
 * @ORM\Entity(repositoryClass="SiteModule\Repository\SiteUserRepository")
 * @ORM\Table(name="site_users")
*/
class SiteUser extends _SiteUser
{
    /**
     * @var boolean
     *
     * @ORM\Column(name="test", type="boolean")
     */
    protected $test;

    /**
     * @var SiteUserTo
     *
     * @ORM\OneToOne(targetEntity="SiteModule\Entity\SiteUserTo", mappedBy="user")
     */
    protected $user_to;
}

和SiteUserTo这样:

/**
 * Class SiteUserTo
 *
 * @ORM\Entity(repositoryClass="SiteModule\Repository\SiteUserToRepository")
 * @ORM\Table(name="users_to")
*/
class SiteUserTo extends _SiteUserTo
{
    /**
     * @var boolean
     *
     * @ORM\Column(name="test", type="boolean")
     */
    protected $test;

    /**
     * @var SiteUser
     *
     * @ORM\OneToOne(targetEntity="SiteModule\Entity\SiteUser", inversedBy="user_to")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

}

我遇到了同样的问题,表user_id中没有字段users_to。但是在表site_users和表users_to中都很好地创建了“测试”字段。

1 个答案:

答案 0 :(得分:1)

  

映射的超类不能是实体,它不可查询,并且   映射超类定义的持久关系必须是   单向的(仅具有拥有方)。这意味着一对多   映射超类根本不可能建立关联。   此外,仅当已映射时,才可能有多对多关联   目前,仅在一个实体中使用超类。对于   继承的进一步支持,单表或联接表继承   功能必须使用。

简单地说,您不能同时具有@MappedSuperClass和@ORM \ Entity批注,因此会产生意想不到的结果

this URL