Azrix
Azrix

Reputation: 109

Problem Symfony/Doctrine : One-To-Many - Self-referencing on a primary key

I would like to have a "post" with an identifier. This one could be classified in another "post" by storing the identifier of his parent.

I tried to do like this:

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;
    ...
}

but I have this error when i'm checking with doctrine:schema:validate :

[FAIL] The entity-class App\Entity\Post mapping is invalid:

  • The association App\Entity\Post#Id_Post_Parent refers to the inverse side field App\Entity\Post#Id_Post which is not defined as association.
  • The association App\Entity\Post#Id_Post_Parent refers to the inverse side field App\Entity\Post#Id_Post which does not exist.
  • The referenced column name 'Id_Post' has to be a primary key column on the target entity class 'App\Entity\Post'.

Can someone help me to fix this ?

Upvotes: 0

Views: 1048

Answers (1)

ejuhjav
ejuhjav

Reputation: 2710

There is small logical error with your structure - your ID_Post variable tries to be both the primary key (the ID) and the collection association side. I didn't check this syntax in too much details (you can find an example of this association along with most of the other associations from doctrine documentation: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-self-referencing), but basically you need to add the children association separately to your entity like this:

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();
    }    
}

Upvotes: 1

Related Questions