使用 Doctrine ORM 如何从自己的表中获取一个表来存储记录?

Posted

技术标签:

【中文标题】使用 Doctrine ORM 如何从自己的表中获取一个表来存储记录?【英文标题】:Using Doctrine ORM how to get a table to store record from its own table? 【发布时间】:2013-12-07 06:45:52 【问题描述】:

我想将此表中的一条记录存储在“父”字段中。产生的错误如下

从 MODL119\Entity\Role 到 MODL119\Entity\Role 的关系引用的列名“id”不存在

以及产生错误的 php 实体类

<?php
namespace MODL119\Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Entity @ORM\Table(name="role")
 */
class Role

    /** @ORM\Id
     *  @ORM\Column(name="role_id", type="bigint")
     *  @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $roleId;

    /** @ORM\ManyToOne(targetEntity="MODL119\Entity\Role")
     *  @ORM\JoinColumn(name="role_id", referencedColumnName="role_id")
     */
    protected $parent;



    public function setParent(Role $parent)
    
        $this->parent = $parent;
    

    public function getParent()
    
        return $this->parent;
    

    public function setRoleId($roleId)
    
        $this->roleId = $roleId;
    

    public function getRoleId()
    
        return $this->roleId;
    

有什么想法吗?

【问题讨论】:

我是否正确理解您要保存一条与同一个表中的另一条记录有关系的记录?如果是这样,请为此设置一个自引用关联映射。 是的,似乎 name="field" 实际上在表中创建了这个字段,而实际的 php 变量存储了引用。对于教义初学者来说学习很奇怪。谢谢 是的,父级将成为表中的外键引用。关系是一对一、一对多还是多对多?我在上面的代码中看到了一些东西,但答案取决于你想要的关系。 【参考方案1】:

属性Role::$parent需要在基础表中表示为外键引用,所以你需要修改你的注解,改变JoinColumn.name如下:

/** 
 * @ORM\ManyToOne(targetEntity="MODL119\Entity\Role")
 *  @ORM\JoinColumn(name="parent_id", referencedColumnName="role_id")
 */
protected $parent;

这会在您的实体中建立一个one-to-one self-referencing association,并在基础表中创建一个parent_id 列。

另见:

one-to-many self-referencing association many-to-many self-referencing association

希望这会有所帮助:)

【讨论】:

以上是关于使用 Doctrine ORM 如何从自己的表中获取一个表来存储记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Doctrine ORM 查询中查找与别名相关的表?

[Doctrine Migrations] 数据库迁移组件的深入解析四:集成diff方式迁移组件

使用Doctrine2加入表中的鉴别器

原则:我可以使用 SQL 来创建我的表吗?

ZF2 - Doctrine ORM,简单表连接

Doctrine ORM:像另一个一样创建表