Правильно создать рекурсивную / рефлексивную связь ManyToMany с доктриной ORM (Symfony)

У меня есть этот объект по имени Pointscomptage.php:

class Pointscomptage

    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;

        /**
         * @var string
         *
         * @ORM\Column(name="invariant", type="string", length=150, nullable=false)
         */
        private $invariant;

        /**
         * @var string
         *
         * @ORM\Column(name="nom", type="string", length=150, nullable=false)
         */
        private $nom;

        /**
         * @var string
         *
         * @ORM\Column(name="consoProduction", type="string", length=150, nullable=false)
         */
        private $consoProduction;

        /**
         * @var Typesenergie
         *
         * @ORM\ManyToOne(targetEntity="Typesenergie", inversedBy="pointscomptage")
         * @ORM\JoinColumn(name="typesenergie_id", referencedColumnName="id")
         */
        private $typesenergie;

        /** ... getters and setters */

Мне нужно понять, как создать рекурсивное илирефлексивное отношение ManyToMany для этой сущности.

То есть у Pointcomptage не может быть (0) или много (n) Pointscomptage.

Как сделать это отношение на этой же сущности?


РЕДАКТИРОВАТЬ

Благодаря ответу Йована Перовича и предложению этого решения, которое я нашел, мы должны соблюдать аннотацию доктрины:

/**
     * @ORM\ManyToMany(targetEntity="Pointscomptage")
     * @ORM\JoinTable(name="pointscomptage_link_table",
     * joinColumns={
     *     @ORM\JoinColumn(name="pointscomptage_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="id_pointscomptage2", referencedColumnName="id")
     *   }
     * )
     **/
    private $pointscomptages;

Спасибо большое.

1 ответ

Решение

Это можно сделать так же, как и с любой сущностью. Смотрите официальные документы на @ManyToMany

Например:

/**
 * @ManyToMany(targetEntity="Pointscomptage")
 * @JoinTable(name="pointscomptage_link_table",
 *      joinColumns={@JoinColumn(name="id_pointscomptage1", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="id_pointscomptage2", referencedColumnName="id")}
 *      )
 **/
private $pointscomptages;

В этом примере предполагается следующее:

  • Отношение является однонаправленным. Двунаправленный также легко достигается и описан также в ссылке на документы выше.
  • Соединительная таблица названа pointscomptage_link_table
  • Соединительный стол pointscomptage_link_table содержит два ключа столбца:
    • id_pointscomptage1
    • id_pointscomptage2

Надеюсь это немного поможет...

Другие вопросы по тегам