Установите PK из аннотаций ManyToMany в сущности Doctrine2

0

У меня есть отношения ManyToMany между таблицами Pais и FabricanteDistribuidor определены следующим образом:

Pais.php

class Pais
{
    // column definitions

    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\FabricanteDistribuidor", inversedBy="paises", cascade={"persist"})
     * @ORM\JoinTable(name="negocio.fabricante_distribuidor_pais", schema="negocio",
     *      joinColumns={@ORM\JoinColumn(name="fabricante_distribuidor_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")}
     * )
     */
    protected $fabricanteDistribuidor;

    /**
     * Add fabricanteDistribuidor
     *
     * @param AppBundle\Entity\FabricanteDistribuidor $fabricanteDistribuidor
     */
    public function addfabricanteDistribuidor(\AppBundle\Entity\FabricanteDistribuidor $fabricanteDistribuidor)
    {
        $this->fabricanteDistribuidor[] = $fabricanteDistribuidor;
    }

    /**
     * Get fabricanteDistribuidor
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getfabricanteDistribuidor()
    {
        return $this->fabricanteDistribuidor;
    }
}

FabricanteDistribuidor.php

class FabricanteDistribuidor
{
    // column definitions

    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Pais", mappedBy="fabricanteDistribuidor", cascade={"persist"})
     */
    protected $paises;

    public function __construct()
    {
        $this->paises = new ArrayCollection();
    }

    /**
     * Set paises
     *
     * @param  AppBundle\Entity\Pais $pais
     * @return FabricanteDistribuidor
     */
    public function addPaises(\AppBundle\Entity\Pais $pais)
    {
        $this->paises[] = $pais;
        return $this;
    }

    /**
     * Get paises
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getPaises()
    {
        return $this->paises;
    }
}

Это приведет к созданию таблицы fabricante_distribuidor_pais в схеме negocio с fabricante_distribuidor_id и pais_id FK, указывающей на PK в связанных таблицах, что прекрасно.

Что касается этого сценария:

1- Можно определить fabricante_distribuidor_id и pais_id как PK на таблице fabricante_distribuidor_pais? Я имею в виду добавление дополнительной аннотации или мне нужно создать внешний объект и установить их как @ORM\Id в определении столбца?

2- Являются ли методы addXXX и getXXX правильными в моих сущностях? Я имею в виду: я должен добавить один или несколько paises (от лица Pais) к FabricanteDistribuidor легко, и я не забочусь об обратном отношении, то есть я не буду добавлять FabricanteDistribuidor из Pais, они правы или мне нужно изменить что нибудь?

Теги:
doctrine
doctrine2

1 ответ

1
Лучший ответ

1- Если один id является первичным ключом, отношение не становится много для одного/одного для многих? Даже 1to1, если оба PK
2- Если вы не заботитесь об обратном, вы собираетесь добавлять геттеры и сеттеры только в одном объекте да. Вы все равно можете изменить его на biredictionnal позже с атрибутом "mappedBy"


Проверьте, существует ли сущность:

Вы можете сделать это в своем контроллере:

например, в платах

$data = $em->getRepository('AcmeBundle:Pais')->findOneByFabricanteDistribuidor($id);
if($data)
{
    // the entity is allready persisted 
}
else
{
    // no, we can persist the entity
}
  • 0
    вы правы! Теперь, имея ту же информацию, как я могу проверить, например, если записи уже существуют на fabricante_distribuidor_pais для предотвращения, то возникает ошибка non-duplicates, если я пытаюсь вставить то же самое, какой-нибудь совет по этому поводу?
  • 0
    если вы строите отношения один ко многим или много к одному, промежуточной таблицы не будет. Во всяком случае во всех случаях вы можете делать то, что я написал в моем редактировании
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню