如何在单个超级映射 class 中创建 ManyToOne 关系

How do you create ManyToOne relation within single supermapped class

我正在为我的无头 symfony 后端创建一个简单的 CMS 包,我正在尝试将页面映射到具有 parent 和 child 关系的页面(许多 children 到一个parent) 并且我有这个 class 映射超级 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;
    }
}

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

<?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. 

我不太明白为什么它会产生这个错误或者我试图归档的东西是不可能的,我已经在映射的 superclasses 上做了关系但是它是 2 个或更多 tables 而不是单上。我已经尝试创建 $children 字段,但它没有用,仍然产生上述错误。有没有人试图创造类似的东西?我在学说文档中找不到任何关于此的内容,只找到了如何映射 2 个不同的 superclasses。我想最简单的方法是在 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

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 定义为相同的 class 那么它也会在相同的 class 上创建 OneToMany - 正如你在上面读到的那样,这是被禁止的。