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


Set PK from ManyToMany annotations in Doctrine2 entity

我在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;
    }
}

这将在模式negocio上生成一个表fabricante_distribuidor_pais,其中fabricante_distribuidor_idpais_idFK指向相关表上的PK,这很好。

关于这种情况:

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

2-addXXXgetXXX方法在我的实体中正确吗?我的意思是:我应该很容易地将一个或多个paises(来自Pais实体)添加到FabricanteDistribuidor中,我不在乎逆关系,这意味着我不会从Pais添加FabricanteDistribuidor,它们是对的吗?还是我需要更改一些东西?

1-如果一个id是主键,那么关系不是变成多对一/一对多吗?甚至1to1如果两者都是PK
2-如果你不关心相反的情况,你将只在一个实体中添加getter和setter。稍后,您仍然可以使用属性"mappedBy"将其更改为双预测纳尔


检查实体是否存在:

你可以在你的控制器中做到这一点:

例如Pays

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