您如何在单个超级映射的类中创建ManyToOne关系

问题描述 投票:0回答:2

我正在为无头的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的项目中声明它,那么这几乎破坏了可重用代码的目的。我相信在堆栈中,让我们弄清楚这一点。谢谢!

php symfony doctrine-orm doctrine
2个回答
0
投票

由于某些原因,仅在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;
    }

如果有人知道为什么要这样,我很乐意对我的回答发表评论。


0
投票

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

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

...

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

据此:

  • MappedSuperclass不能是实体
  • 不能具有一对多关系-因此,如果将同一个类定义ManyToOne,那么它也会在同一个类上创建OneToMany-如上面所读,这是禁止的。
© www.soinside.com 2019 - 2024. All rights reserved.