Doctrine2 - 使用外键列作为普通字段

Iva*_*tar 4 php orm foreign-key-relationship doctrine-orm

有没有办法在教义中拥有这样的东西:

class Entity {

    /**
     * @Column(name="related_entity_id")
     */
    private $relatedEntityId;

    /**
     * @ManyToOne(targetEntity="RelatedEntitiy")
     * @JoinColumn(name="related_entity_id", referencedColumnName="id")
     */ 
    private $relatedEntity;
}
Run Code Online (Sandbox Code Playgroud)

我想做的事情是这样的:

调用Entity::setRelatedEntityId($someId),并持久化实体,并通过调用Entity::getRelatedEntity()让实体返回相关实体。

相关实体是从严格限制的表中选择的,它永远不会在运行时动态增长,因此相关实体 id 的数量是有限的。

在创建新实体时,我想设置相关实体​​ id,但不必从数据库中获取整个相关实体。

就我可以测试这一点而言,它不起作用,因为如果我设置了 relatedEntityId 而不是 relatedEntity,Doctrine 会自动将 related_entity_id 列设置为 null,因为基本上没有建立任何关系。

我也试过做这样的事情:

删除 relatedEntityId 属性,并使用

Entity::setRelatedEntity(new RelatedEntity($relEntId))
Run Code Online (Sandbox Code Playgroud)

RelatedEntity 的构造函数将设置 id,但不会设置其他值。我不想保留相关实体(它的值已经在数据库中为给定的 $relEntId 设置),但这次 Doctrine 在刷新时发出错误信号,因为它有一个非持久化的实体。

基本上,我想要做的是创建一个关系,除了相关实体的 Id 之外什么都不知道。如果有其他方法可以做到这一点,请分享。

提前致谢

编辑:

我找到了解决方法。由于相关实体将是一组有限的不可变对象,我已经完成了以下操作:

  1. 使用 entityManager 查找所有相关实体;
  2. 将列表注入将创建新实体的对象
  3. 创建新实体时,从列表中选择一个相关实体作为其相关实体

我会把这个问题留待一两天,以防万一有人想出更好的办法。

mez*_*eze 5

使用实体代理:

Entity::setRelatedEntity($entityManager->getReference('RelatedEntity', $relEntId))
Run Code Online (Sandbox Code Playgroud)

  • @Pinetree 您可以随时添加另一层。创建一个了解 EM 的实体工厂并创建您的域对象(这是很好的 OOP 设计)。 (2认同)