学说一对一单向

php*_*hil 2 php orm symfony doctrine-orm

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

但是,一对一的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我坚持国家实体时,我收到Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails. 检查数据时,我可以看到 Doctrine 试图将 MySubEntity 的 id 设置为 0。

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

Joe*_*Joe 10

您需要将 JoinColumn 名称属性更改为其他任何内容,但不是 id:

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

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

如果您说 JoinColumn 名称是您实体的主键已使用的 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