Symfony 如何使与MappedSuperclass的关系起作用?
我对Symfony 5中的多对一映射超类有问题。我有一个扩展MappedSuperclass抽象类Person的实体Employee、Employer。我想创建一个与个人(包括雇员和雇主)相关的raports实体,如下所示:Symfony 如何使与MappedSuperclass的关系起作用?,symfony,doctrine,symfony5,Symfony,Doctrine,Symfony5,我对Symfony 5中的多对一映射超类有问题。我有一个扩展MappedSuperclass抽象类Person的实体Employee、Employer。我想创建一个与个人(包括雇员和雇主)相关的raports实体,如下所示: /** * @ORM\ManyToOne(targetEntity=Person::class) */ private $person; 但当我尝试推动迁移时,会收到以下错误消息: 从App\Entity\Raport到App\Ent
/**
* @ORM\ManyToOne(targetEntity=Person::class)
*/
private $person;
但当我尝试推动迁移时,会收到以下错误消息:
从App\Entity\Raport到App\Entity\Person的关系引用的列名id
不存在
但我在这些类中有id属性:
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
我在Symfony页面示例中找到了创建界面的方法,但它对我来说也不起作用。也许有人以前有过这个问题,并且知道如何解决它。非常感谢您的回复
编辑
我的个人类别:
**
* 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)
现在,当我尝试创建Now Employee或Employer时,将其从超类更改为“JOINED”继承时,会出现以下错误:
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;
}
}
尝试删除摘要。我没有MappedSuperclass作为关系。我已将MappedSuperclass设置为项目中某个类的抽象类,但出现了一个错误。抽象类似乎是不允许的。它也是有意义的,因为从这个意义上讲它不是一个抽象类。您不能将关系目标设置为MappedSuperClass,因为它本身不是一个实体。它本身只能定义一对一关系(或非常有限的多对多关系): 映射的超类不能是实体,它是不可查询的,并且由映射的超类定义的持久关系必须是单向的(仅限拥有方)。这意味着映射超类上根本不可能存在一对多关联。此外,仅当映射的超类此时仅在一个实体中使用时,才可能存在多对多关联。为了进一步支持继承,必须使用单表或联接表继承特性 资料来源:
您可能需要的是单个表继承或类表继承(参见上面的链接,它也显示了这些)。不过,这可能会让人非常恼火。您已收到警告。可能与MappedSuperClass(在Symfony中)存在关系。您需要的是动态映射,它没有很好的文档记录。你必须使用。doc示例非常(非常)简单,但您可以做得更多 在您的情况下,必须检查实体是否是您想要的实体,并且不是MappedSuperClass:
您需要一个注释(@MappedSuperclass)。看,我已经在Person类中进行了注释。很抱歉,我之前没有澄清:(删除抽象。我没有MappedSuperclass作为关系。我已将MappedSuperclass设置为项目中某个类的抽象,但我收到一个错误。抽象类似乎不被允许。遗憾的是,这无助于:(@kri016我记得我以前在继承实体时有id属性,然后在每个类的末尾都重新添加了id属性,现在我自己都无法调试了,我没办法了。