OneToOne 双向关系的错误映射原则

Error mapping doctrine on OneToOne bidirectional relation

我正在尝试创建一个与另一个实体相连的实体 1:1。重点是 Equip 必须有一个 Estadi,而且只有一个。我可以正确更新架构,数据库没问题,但在网页调试器上出现映射错误。

The association AppBundle\Entity\Equip#estadi refers to the inverse side field AppBundle\Entity\Estadi#nom which is not defined as association.

The association AppBundle\Entity\Equip#estadi refers to the inverse side field AppBundle\Entity\Estadi#nom which does not exist

这是 Estadi 实体:

/**
* @ORM\Entity
* @ORM\Table(name="estadis")
*/

class Estadi{
    /**
    * @ORM\Column(type="string",length=30)
    * @ORM\OneToOne(targetEntity="Equip",mappedBy="estadi",cascade={"persist"})
    * @ORM\Id
    */
    protected $nom;

    /**
    * @ORM\Column(type="integer")
    */
    protected $aforament;

    /**
    * @ORM\Column(type="integer")
    */
    protected $num_portes;

    /**
    * @ORM\Column(type="string",length=50)
    */
    protected $direccio;

    /**
    * @ORM\Column(type="string", length=4)
    */
    protected $any_construccio;

    /**
    * @ORM\Column(type="string", length=30)
    */
    protected $nom_aficio;
}

这是实体装备:

/**
* @ORM\Entity
* @ORM\Table(name="equips")
*/

class Equip{
    /**
    * @ORM\Column(type="string",length=30)      
    * @ORM\Id
    */
    protected $nom;

    /**
    * @ORM\Column(type="integer")
    */
    protected $punts_lliga;

    /**
    * @ORM\Column(type="integer")
    */
    protected $num_jugadors;

    /**
    * @ORM\OneToOne(targetEntity="Estadi",inversedBy="nom")
    * @ORM\JoinColumn(name="nom_estadi",referencedColumnName="nom",onDelete="SET NULL")
    */
    protected $estadi;

    /**
    * @ORM\OneToOne(targetEntity="Entrenador",inversedBy="nom")
    * @ORM\JoinColumn(name="nom_entrenador",referencedColumnName="nom",onDelete="SET NULL")
    */      
    protected $entrenador;

    /**
    * @ORM\ManyToOne(targetEntity="Lliga",inversedBy="equips")
    * @ORM\JoinColumn(name="nom_lliga",referencedColumnName="nom",onDelete="SET NULL")
    */
    protected $lliga;

    /**
    * @ORM\OneToMany(targetEntity="Jugador",mappedBy="nom_equip")
    */
    protected $jugadors;

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

当您定义 @OneToOne 注释时,它不应该在您的主键上。拥有实体应包含单个关联(单向),或者每个实体应包含与另一个实体的关联 - 作为实体,不连接到主键。

您的 Equip 映射应该如下所示:

/**
 * @ORM\OneToOne(targetEntity="Estadi", inversedBy="equip")
 * @ORM\JoinColumn(name="nom_estadi", referencedColumnName="nom")
 */
protected $estadi;

public function setEstadi(Estadi $estadi)
{
    $this->estadi = $estadi;

    return $this;
}

public function getEstadi()
{
    return $this->estadi;
}

您的 Estadi 映射应该如下所示:

/**
 * @OneToOne(targetEntity="Equip", mappedBy="estadi")
 */
protected $equip;

public function getEquip(Equip $equip)
{
    return $this->equip;
}

我删除了 cascadeonDelete,因为如果你通过 Doctrine 处理所有事情,它应该会自动为你处理,但你仍然可能对它们有用。我也只按照您描述的方式将 setter 放在拥有实体上,但您也可以将它放回 Estadi 实体上 - 这取决于您。