问题Symfony /理论:一对多-主键上的自引用

时间:2018-11-23 19:25:14

标签: symfony doctrine primary-key

我想要一个带有标识符的“帖子”。通过存储其父母的标识符,可以将此人分类为另一个“职位”。

我试图这样做:

class Post {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @ORM\OneToMany(targetEntity="Post", mappedBy="Id_Post_Parent")
     */
    private $Id_Post;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Post", inversedBy="Id_Post")
     * @ORM\JoinColumn(name="Id_Post", referencedColumnName="Id_Post", nullable=true)
     */
    private $Id_Post_Parent;
    ...
}

但是我在用doctrine:schema:validate检查时遇到了这个错误:

  

[失败]实体类App \ Entity \ Post映射无效:

     
      
  • App \ Entity \ Post#Id_Post_Parent关联是指未定义为关联的反字段App \ Entity \ Post#Id_Post。
  •   
  • App \ Entity \ Post#Id_Post_Parent关联是指不存在的反向字段App \ Entity \ Post#Id_Post。
  •   
  • 引用的列名称'Id_Post'必须是目标实体类'App \ Entity \ Post'上的主键列。
  •   

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您的结构存在一个小逻辑错误-您的ID_Post变量尝试同时充当主键(ID)和集合关联方。我没有详细检查此语法(您可以从学说文档https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-self-referencing中找到此关联的示例以及大多数其他关联),但基本上,您需要将children关联单独添加到您的这样的实体:

class Post 
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Post", inversedBy="postChildren")
     * @ORM\JoinColumn(name="id_parent_post", referencedColumnName="id", nullable=true)
     */
    private $postParent;

    /**
     * @ORM\OneToMany(targetEntity="Post", mappedBy="postParent")
     */
    private $postChildren;

    public function __construct() {
        $this->postChildren = new \Doctrine\Common\Collections\ArrayCollection();
    }    
}