【问题标题】:Doctrine OneToOne with multiple tablesDoctrine OneToOne 与多个表
【发布时间】:2017-09-18 06:35:02
【问题描述】:

我正在使用学说 2 和 zend 框架 3。我得到了一个实体“Project”,它与“projectdetails”有 OneToOne 关系。 ProjectDetails 根据项目字段“类型”在多个表之间拆分。

有没有一种简单的方法可以根据类型字段 Value 告诉教义哪个表用于 projectdetails?

【问题讨论】:

  • 为什么不保存项目实体的详细信息是否有任何特定的原因来建立 OneToOne 关系?
  • 详细信息是来自具有多个来源的外部来源的固定信息,我需要为每个来源提供 1 个表格。它们可以在项目中更改,但我需要能够将详细信息对象中的信息与项目本身的信息进行比较。

标签: php doctrine-orm dql zend-framework3


【解决方案1】:

您可以为每个 projectdetails 表定义“OneToOne”关联:

/**
 * @OneToOne(targetEntity="ProjectDetails1")
 * @JoinColumn(name="project_details_id", referencedColumnName="id")
 */
private $projectDetails1;

/**
 * @OneToOne(targetEntity="ProjectDetails2")
 * @JoinColumn(name="project_details_id", referencedColumnName="id")
 */
private $projectDetails2;

添加更多 projectdetails 表。 然后使用 getter 函数根据类型获取正确的关系:

function getProjectDetails() {
    if($this->type === 'type1') {
        return $this->projectDetails1;
    }
    elseif($this->type === 'type2') {
        return $this->projectDetails2;
    }
}

更新:在这种情况下,您不能使用教义控制台工具来生成关联,因为无法将“project_details_id”上的外键设置为 2 个不同的表格。

为了解决这个问题,应该使用迁移创建整数类型的列project_details_id,或者您可以在Project实体中定义一个字段:

/**
 * @ORM\Column(type="integer", nullable=true)
 */
private $projectDetailsId;

生成并运行迁移。最后用上面的关联替换后一个字段。

【讨论】:

  • 可以的,谢谢。但是有没有办法为每个 projectdetails 类型创建一个子类?它总是相同的实体只是一个不同的表。
  • @Jannes Botis!如果您运行教义:迁移:迁移,架构中会发生什么?我假设 project_id 在项目表中是 PK,对于 ProjectDetails1 和 ProjectDetails2 也是 PK/FK。如果您运行提到的命令,我会看到唯一密钥问题。我想知道,如果你有什么事情。
  • 不幸的是,在这种情况下,您无法使用教义控制台工具进行架构更新、生成和运行迁移。为了克服这个问题,您可以首先定义一个没有关联的整数字段,生成并运行您的迁移,然后使用上述关联。我会更新我的答案以使其更清楚。
  • @Sam 注意我将名称从“project_id”更新为“project_details_id”。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 2012-09-28
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多