如何使MappedSuperclass的关系有效?

问题描述 投票:0回答:1

我在Symfony 5中遇到了Many to One与MappedSuperclass的关系问题,我有Employee和Employer两个实体,它们都是MappedSuperclass抽象类Person的延伸。我想创建一个raports实体,它将与Person(包括Employee和Employer)有如下关系。

    /**
     * @ORM\ManyToOne(targetEntity=Person::class)
     */
    private $person;

但是当我尝试推送迁移时,我得到以下错误信息。

列名 id 从App/Entity/Raport到App/Entity/Person的关系引用不存在。

但我在这些类中有id属性。

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    protected $id;

我在Symfony的页面上找到了一个创建接口的例子,但是我也没有用。也许有人曾经遇到过这个问题,知道如何解决。非常感谢你的回复。

EDIT我的Person类。

**
 * Abstract base class to be extended by my entity classes with same fields
 *
 * @MappedSuperclass
 */
abstract class Person
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    protected $id; //This property exist in Employee and Employer too (like doctrine documentation said)

现在当我把它从superclass改为'JOINED'继承时,当我尝试创建Employee或Employer时,我得到以下错误。

An exception occurred while executing 'INSERT INTO person (discr) VALUES  
   (?)' with params ["Employee"]:                                                  

  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error i  
  n your SQL syntax; check the manual that corresponds to your MySQL server v  
  ersion for the right syntax to use near 'person (discr) VALUES ('Employee')'  
   at line 1        

没有任何其他方法可以让一个属性与实现一个接口或扩展类的少数实体建立关系吗?有时我讨厌教条... 而我的个人实体也许可以帮助配置出问题所在。

* @ORM\Entity(repositoryClass=PersonRepository::class)
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"person" = "Person", "employee" = "Employee", "employer" = "Employer"})
 */
class Person
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    protected $id;

    public function getId(): ?int
    {
        return $this->id;
    }

}
symfony doctrine symfony5
1个回答
2
投票

你不能让一个关系以MappedSuperClass为目标,因为它本身不是一个实体。它本身只能定义一个自己的一对一关系(或非常有限的多对多)。

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

来源 https:/www.doctrine-project.orgprojectsdoctrine-ormen2.7referenceinheritance-mapping.html#mapped-superclasses

您的 可能 想要的是单表继承或类表继承(见上面的链接,它也显示了这些)。不过这可能会变得相当烦人。你已经被警告了。


-1
投票

尝试删除 抽象. 我没有一个MappedSuperclass作为关系。我在一个项目中为一个类设置了MappedSuperclass是抽象的,但我得到一个错误。抽象类似乎不被允许。这也是有道理的,因为从这个意义上讲,它不是一个抽象类。

© www.soinside.com 2019 - 2024. All rights reserved.