如何在单个超映射类中创建多对一关系



我正在为我的无头symfony后端创建一个简单的CMS捆绑包,我正在尝试将具有父子关系的页面映射到页面(许多孩子到一个父级(,我有这个类映射超类来创建可重用的代码,这是我尝试存档的内容的缩小示例:


use DoctrineORMMapping as ORM;
/**
* @ORMMappedSuperclass()
*/
class Test
{
/**
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
public function getId()
{
return $this->id;
}
/**
* @ORMManyToOne(targetEntity="ZieburaCMSBundleEntityTest")
*/
protected $parent;
public function getParent()
{
return $this->parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
}

然后我将此类扩展为普通实体以创建数据库表

<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use ZieburaCMSBundleEntityTest as BaseTest;
/**
* @ORMTable(name="test")
* @ORMEntity(repositoryClass="AppRepositoryTestRepository")
*/
class Test extends BaseTest
{
}

问题是我得到了这个教义例外

Column name `id` referenced for relation from AppEntityTest towards ZieburaCMSBundleEntityTest does not exist. 

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

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

映射

超类是一个抽象或具体的类,它为其子类提供持久实体状态和映射信息,但它本身不是实体。通常,此类映射超类的用途是定义多个实体类共有的状态和映射信息。

映射的超类不能是实体,它不是可查询的,映射的超类定义的持久关系必须是单向的(仅具有拥有方(。这意味着在映射的超类上根本不可能实现一对多关联。

据此:

  • 映射的超类不能是实体
  • 不能有一对多关系 - 所以如果你将 ManyToOne 定义为同一个类,那么它也会在同一类上创建 OneToMany——正如你在上面读到的,这是被禁止的。

由于某种原因,仅在 BaseTest 中更改完整实体路径解决了引发异常的应用程序并且它有效,如果有人遇到同样的问题,请尝试更改

/**
* @ORMManyToOne(targetEntity="ZieburaCMSBundleEntityTest")
*/
protected $parent;
public function getParent()
{
return $this->parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}

/**
* @ORMManyToOne(targetEntity="Test")
*/
protected $parent;
public function getParent()
{
return $this->parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}

如果有人知道为什么它必须这样,我将非常感谢对我的回答发表评论。

相关内容

  • 没有找到相关文章

最新更新