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;
}
我删除了 cascade
和 onDelete
,因为如果你通过 Doctrine 处理所有事情,它应该会自动为你处理,但你仍然可能对它们有用。我也只按照您描述的方式将 setter 放在拥有实体上,但您也可以将它放回 Estadi
实体上 - 这取决于您。
我正在尝试创建一个与另一个实体相连的实体 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;
}
我删除了 cascade
和 onDelete
,因为如果你通过 Doctrine 处理所有事情,它应该会自动为你处理,但你仍然可能对它们有用。我也只按照您描述的方式将 setter 放在拥有实体上,但您也可以将它放回 Estadi
实体上 - 这取决于您。