繁体   English   中英

学说一对一单向

[英]Doctrine one-to-one unidirectional

在带有Doctrine的Symfony 3中,我试图与两个共享相同主键的表建立一对一的单向关系。 为此,我尝试在“ 教义关联映射”页面上复制示例。

但是,一对一的uni文档没有setter和getter的示例-并且在目标实体上也没有id字段的定义。 因此,我尝试围绕自己进行实验。

这些是我的实体:

class Country
{

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="MySubEntity", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=true)
     */
    private $mysubentity;
    [...]
    /**
     * @return MySubEntity
     */
    public function getMySubEntity()
    {
        return $this->mysubentity;
    }

    /**
     * @param MySubEntity $mysubentity
     */
    public function setMySubEntity($mysubentity)
    {
        $this->mysubentity = $mysubentity;
    }
}

class MySubEntity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    [..]

    /**
     * Set id
     *
     * @param $id
     *
     * @return MySubEntity
     */
    public function setId($id)
    {
        $this->id = $id;

        return $this;
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
}

当我保留国家/地区实体时,会收到Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 检查数据时,我可以看到Doctrine试图将MySubEntity的ID设置为0。

有人知道要从Country实体自动填充MySubEntity $ id字段需要做什么吗?

您需要将JoinColumn name属性更改为除id之外的其他任何内容:

/**
 * @ORM\OneToOne(targetEntity="MySubEntity", cascade={"persist", "remove"})
 * @ORM\JoinColumn(name="mysubentity_id", referencedColumnName="id", nullable=true)
 */
private $mysubentity;

这是做什么的:JoinColumn告诉该关系该关系存储在哪个数据库列中。 因此,如果您将其命名为mysub_id,则您的主实体将具有一列具有该名称的列,其中referencedColumn值将保留在其中(您的subEntity的ID)。

如果您说JoinColumn名称是ID,该ID已被您实体的主键使用,则您有冲突。

编辑:

我错过了共享同一主键的要点。 有什么具体原因吗? 但是,如果您确实出于遗留原因需要这样做,请看看

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-2-simple-derived-identity

或通过更改生成策略自行生成子实体的主键值的可能性(在这种情况下为NONE或自定义)

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifier-generation-strategies

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM