gpt4 book ai didi

php - 如何在单个超映射类中创建 ManyToOne 关系

转载 作者:行者123 更新时间:2023-12-04 10:45:11 25 4
gpt4 key购买 nike

我正在为我的 headless symfony 后端创建一个简单的 CMS Bundle,我正在尝试使用父子关系(许多 child 到一个 parent )将页面映射到页面,并且我将这个类映射到父类(super class)来创建可重用的代码,这是一个缩小版关于我要存档的内容的示例:


use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\MappedSuperclass()
*/
class Test
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

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

/**
* @ORM\ManyToOne(targetEntity="Ziebura\CMSBundle\Entity\Test")
*/
protected $parent;

public function getParent()
{
return $this->parent;
}

public function setParent($parent)
{
$this->parent = $parent;
}
}

然后我将这个类扩展为一个普通实体来创建数据库表
<?php

namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Ziebura\CMSBundle\Entity\Test as BaseTest;

/**
* @ORM\Table(name="test")
* @ORM\Entity(repositoryClass="App\Repository\TestRepository")
*/
class Test extends BaseTest
{
}

问题是我得到了这个 Doctrine 异常(exception)
Column name `id` referenced for relation from App\Entity\Test towards Ziebura\CMSBundle\Entity\Test does not exist. 

我不太明白为什么它会产生这个错误,或者我试图存档的事情是不可能的,我已经在映射的父类(super class)上建立了关系,但它是 2 个或更多的表,而不仅仅是一个表。我已经尝试创建 $children 字段但它没有工作并且仍然产生上述错误。有没有人尝试过创建类似的东西?我在 Doctrine 文档中找不到任何关于此的信息,只找到了如何映射 2 个不同的父类(super class)。我想最简单的方法是在 App 命名空间中指定关系而不是在 Bundle 中,但是如果我必须在每个项目中声明我使用 bundle 时,这几乎破坏了可重用代码的目的。我相信堆栈让我们弄清楚这一点。谢谢!

最佳答案

让我们阅读有关此的 Doctrine 文档:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html#inheritance-mapping

A mapped superclass is an abstract or concrete class that provides persistent entity state and mapping information for its subclasses, but which is not itself an entity. Typically, the purpose of such a mapped superclass is to define state and mapping information that is common to multiple entity classes.

...

A mapped superclass cannot be an entity, it is not query-able and persistent relationships defined by a mapped superclass must be unidirectional (with an owning side only). This means that One-To-Many associations are not possible on a mapped superclass at all.



根据这个:
  • MappedSuperclass 不能是实体
  • 不能有一对多的关系——所以如果你将 ManyToOne 定义到同一个类,那么它也会在同一个类上创建 OneToMany——正如你在上面读到的那样,这是被禁止的。
  • 关于php - 如何在单个超映射类中创建 ManyToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740061/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com