php - 共享主键的两个表的一对一关系

标签 php symfony doctrine-orm

我想要两个表,PersonAddress,共享它们的主键:

CREATE TABLE Person (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE Address (personId INT UNSIGNED NOT NULL PRIMARY KEY);

我正在尝试模拟这样一种想法,即当您创建一个 Person 时,您也会为其创建一个 Address

我想出了以下映射:

class Person
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     */
    private $id;

    /**
     * @OneToOne(targetEntity="Address", cascade={"all"})
     * @JoinColumn(name="id", referencedColumnName="personId")
     */
    private $address;

    public function __construct() {
        $this->address = new Address($this);
    }
}

class Address
{
    /**
     * @Id
     * @OneToOne(targetEntity="Person")
     * @JoinColumn(name="personId", referencedColumnName="id")
     */
    private $person;

    public function __construct(Person $person) {
        $this->person = $person;
    }
}

当我尝试保留 Person 时,我希望它级联到 Address,但出现以下异常:

学说\ORM\ORMException

Entity of type Address has identity through a foreign entity Person, however this entity has no identity itself. You have to call EntityManager#persist() on the related entity and make sure that an identifier was generated before trying to persist Address. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations.

我不能显式调用 flush(),因为我没有显式地 persist()ing Address,而是期望 Person 级联持久化 Address

据我所知,Doctrine 的工作应该是在适当的时候flush() 来获取id

当为 PersonAddress 使用不同的 auto_increment id 时,这种一对一的关系很好地级联(但是我必须添加addressIdPerson)。

我的目标是让它们共享相同的 id

这可能吗?

最佳答案

使用如何Identity through foreign Entities在学说 2.1 中?

在您的场景中,您可以使用 @ManyToOne 而不是 @OneToOne 关联。

编辑

当您保留拥有方时,关联也会保留。在您的映射中,即 Address。更改您的映射,以便所有者拥有外键并且一切正常。

/**
 * @OneToOne(targetEntity="Address", cascade={"all"}, inversedBy="person")
 * @JoinColumn(name="id", referencedColumnName="personId")
 */
private $address;

换句话说,如果 Address 应该由 Person 拥有,那么您必须首先保留 Address 以保留协会。 如果您希望与 Person 保持关联,则应将 Person 标记为拥有方,并将 Address 标记为 反面:

/**
 * @Id
 * @OneToOne(targetEntity="Person", inversedBy="address")
 * @JoinColumn(name="personId", referencedColumnName="id")
 */
private $person;

关于php - 共享主键的两个表的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19708898/

相关文章:

javascript - 将 Node.js 与 Symfony2 或 PHP 集成

php - 如何在 Doctrine 2 中配置报价策略

php - 使用学说查询构建器表达查询

php - 安装另一个版本的 PHP 是否安全?

php - Bash脚本自动重新运行PHP文件?

php - 交响乐 2 : How to edit persisted objects in embedded forms

php - 加入时缓慢的学说分页

Symfony/Doctrine - 按 child 和家长类别显示数据库中的产品

php - 学说加密专栏

php - 在 PHP 5.3 中下载许多图像的最快方法?