为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
海绵宝宝撒 2022-07-22 09:56:22
我正在为我的无头 symfony 后端创建一个简单的 CMS Bundle,我正在尝试将页面映射到具有父子关系的页面(许多孩子到一个父母)并且我有这个类映射超类来创建可重用的代码,这是一个缩小的我要存档的示例: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;    }}然后我将这个类扩展为一个普通实体来创建数据库表<?phpnamespace 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 的话,这几乎破坏了可重用代码的目的。我相信堆栈让我们弄清楚这一点。谢谢!
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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

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

...

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

根据这个:

  • MappedSuperclass 不能是实体

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


查看完整回答
反对 回复 2022-07-22
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

出于某种原因,仅更改 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;

    }

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


查看完整回答
反对 回复 2022-07-22
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信