从Doctrine2实体中的ManyToMany注释设置PK

时间:2014-11-10 03:56:22

标签: php symfony doctrine-orm doctrine

我在PaisFabricanteDistribuidor表之间建立了一个ManyToMany关系,定义如下:

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_idpais_id FK指向相关表上的PK,这很好。

关于这种情况:

1-可以在fabricante_distribuidor_id表格中将pais_idfabricante_distribuidor_pais定义为PK吗?我的意思是添加一些额外的注释,或者我需要创建一个外部实体并在列定义上将它们设置为@ORM\Id

2-我的实体中的addXXXgetXXX方法是否合适?我的意思是:我应该轻松地将一个或多个paises(来自Pais实体)添加到FabricanteDistribuidor,我不关心反向关系意味着我不会添加FabricanteDistribuidor一个Pais,他们是正确的还是我需要改变一些东西?

1 个答案:

答案 0 :(得分:1)

1-如果一个id是主键,那么关系会变成多对一/一对多?如果两者都是PK,即使是1to1 2-如果你不关心逆,你只会在一个实体中添加getter和setter yes。您仍然可以使用属性“mappedBy”

将其更改为biredictionnal

检查实体是否存在:

您可以在控制器中执行此操作:

例如在Pays

$data = $em->getRepository('AcmeBundle:Pais')->findOneByFabricanteDistribuidor($id);
if($data)
{
    // the entity is allready persisted 
}
else
{
    // no, we can persist the entity
}