【问题标题】:Error mapping doctrine on OneToOne bidirectional relationOneToOne 双向关系的错误映射原则
【发布时间】: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();
    }
}

【问题讨论】:

    标签: symfony doctrine-orm mapping


    【解决方案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;
    }
    

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

    【讨论】:

    • 我会试一试,告诉你效果如何!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多