簡體   English   中英

原則-OneToOne關系不適用於擴展MappedSuperclass

[英]Doctrine - OneToOne relationship not working with extends MappedSuperclass

我嘗試使用@MappedSuperclass。 它適用於簡單變量(整數,字符串...)和OneToMany / ManyToOne關系。 但是,一對一關系不起作用。

我有兩個具有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;

}

我遇到了同樣的問題,表users_to沒有字段user_id 但現場“測試”在表中創建良好site_users並在表users_to ...

映射的超類不能是實體,它不能查詢,並且映射的超類定義的持久關系必須是單向的(僅具有擁有方)。 這意味着在映射的超類上根本不可能存在一對多關聯。 此外,僅當映射的超類目前僅在一個實體中使用時,才可能有多對多關聯。 為了進一步支持繼承,必須使用單個或聯合表繼承功能。

簡而言之,您不能同時具有@MappedSuperClass和@ORM \\ Entity批注,因此會產生意外的結果

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM