Доктрина - отношения OneToOne, не работающие с, расширяют MappedSuperclass - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь использовать @MappedSuperclass. Это хорошо работает для простых переменных (int, string ...) и отношений OneToMany / ManyToOne. Но отношения OneToOne не работают.

У меня есть два MappedSuperclass с отношением OneToOne: _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), он создает таблицу «users_to» только с полем id. Я не знаю почему ...

Если я обновлю свой класс 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;
}

И SiteUser, чтобы вот так:

/**
 * 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 Ответ

1 голос
/ 07 марта 2019

Сопоставленный суперкласс не может быть сущностью, он не может запрашивать и постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленный (только со стороны владельца). Это означает, что один ко многим ассоциации на сопоставленном суперклассе вообще невозможны. Кроме того, ассоциации «многие ко многим» возможны только в том случае, если Суперкласс используется только в одной сущности на данный момент. За дальнейшая поддержка наследования, наследование одиночной или объединенной таблицы функции должны быть использованы.

Проще говоря, вы не можете иметь аннотации @MappedSuperClass и @ORM \ Entity одновременно, отсюда и неожиданные результаты

https://www.doctrine -project.org / проекты / Доктрина-ОРМ / ы / 2,6 / ссылки / наследования mapping.html

...