【问题标题】:Doctrine - OneToOne relationship not working with extends MappedSuperclassDoctrine - OneToOne 关系不适用于扩展 MappedSuperclass
【发布时间】:2019-03-07 08:48:27
【问题描述】:

我尝试使用@MappedSuperclass。它适用于简单变量(int、string...)和 OneToMany/ManyToOne 关系。但是 OneToOne 关系不起作用。

我有两个具有 OneToOne 关系的 MappedSuperclass : _网站用户

/**
 * @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;

这是我扩展这些 MappedSuperclass 的 2 类: 站点用户

/**
 * 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;

}

我遇到了同样的问题,表users_to 中没有字段user_id。但是在表site_users 和表users_to 中创建了字段“test”...

【问题讨论】:

    标签: php sql doctrine-orm doctrine mappedsuperclass


    【解决方案1】:

    映射的超类不能是实体,它不可查询并且 映射超类定义的持久关系必须是 单向(只有拥有方)。这意味着一对多 在映射的超类上根本不可能进行关联。 此外,多对多关联只有在映射的情况下才有可能 超类目前仅在一个实体中使用。为了 进一步支持继承,单表或联表继承 必须使用功能。

    简单地说你不能同时拥有@MappedSuperClass 和@ORM\Entity 注解,因此会出现意想不到的结果

    https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2017-06-16
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多