OneToOne 双向关系的错误映射原则
Posted
技术标签:
【中文标题】OneToOne 双向关系的错误映射原则【英文标题】:Error mapping doctrine on OneToOne bidirectional relation 【发布时间】:2016-02-24 17:49:28 【问题描述】:我正在尝试创建一个与另一个实体 1:1 连接的实体。关键是Equip必须有一个Estadi,而且只有一个。我可以正确更新schema,数据库没问题,但是在网页调试器上出现映射错误。
关联 AppBundle\Entity\Equip#estadi 指的是逆 侧字段 AppBundle\Entity\Estadi#nom 未定义为 协会。
关联 AppBundle\Entity\Equip#estadi 指的是逆 边字段 AppBundle\Entity\Estadi#nom 不存在
这是实体 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();
【问题讨论】:
【参考方案1】:当您定义 @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;
我删除了 cascade
和 onDelete
,因为如果您通过 Doctrine 处理所有事情,它应该会自动为您处理,但您仍然可以使用它们。我也只按照您描述的方式将设置器放在拥有实体上,但您也可以将其放回您的 Estadi
实体上 - 这取决于您。
【讨论】:
我会试一试,告诉你效果如何!非常感谢!以上是关于OneToOne 双向关系的错误映射原则的主要内容,如果未能解决你的问题,请参考以下文章