我正在为无头的symfony后端创建一个简单的CMS捆绑包,并且尝试通过父子关系将Page to Page映射(很多孩子到一个父级),并且我将此类映射为超类以创建可重用的代码,我要存档的缩小样本:
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
{
}
问题是我得到了该学说的例外
Column name `id` referenced for relation from App\Entity\Test towards Ziebura\CMSBundle\Entity\Test does not exist.
我不太明白为什么会产生此错误,或者是我试图将其归档的原因,我已经对映射的超类进行了关联,但它是2个或更多表,而不仅仅是一个表。我已经尝试创建$ children字段,但是它没有起作用,并且仍然产生上述错误。有人试图创造类似的东西吗?我在学说文档中找不到关于此的任何内容,只找到了如何映射2个不同的超类。我想简单的方法是在App命名空间中而不是在Bundle中指定关系,但是如果我必须在每个使用bundle的项目中声明它,那么这几乎破坏了可重用代码的目的。我相信在堆栈中,让我们弄清楚这一点。谢谢!
由于某些原因,仅在BaseTest解决的应用程序中更改完整实体路径会引发异常,并且可以正常工作,如果有人会遇到相同的问题,请尝试更改
/**
* @ORM\ManyToOne(targetEntity="Ziebura\CMSBundle\Entity\Test")
*/
protected $parent;
public function getParent()
{
return $this->parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
收件人
/**
* @ORM\ManyToOne(targetEntity="Test")
*/
protected $parent;
public function getParent()
{
return $this->parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
如果有人知道为什么要这样,我很乐意对我的回答发表评论。
让我们阅读有关这方面的Doctrine文档:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html#inheritance-mapping
映射的超类是一个抽象或具体的类,它为其子类提供持久的实体状态和映射信息,但它本身不是实体。通常,此类映射超类的目的是定义多个实体类共有的状态和映射信息。
...
映射的超类不能是实体,它不能查询,并且映射的超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着在映射的超类上根本不可能存在一对多关联。
据此: