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

时间:2012-05-28 06:51:43

标签: php orm doctrine-orm foreign-key-relationship

有没有办法在学说中有这样的东西:

class Entity {

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

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

我想做什么我做这样的事情:

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

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

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

至于我可以测试它,它不起作用,因为如果我设置relatedEntityId但不设置relatedEntity,则Doctrine会自动将related_entity_id列设置为null,因为基本上没有建立任何关系。

我也尝试过这样的事情:

删除relatedEntityId属性,然后使用

Entity::setRelatedEntity(new RelatedEntity($relEntId))

RelatedEntity的构造函数将设置id,但不设置其他值。 我不想持久保存RelatedEntity(它的值已经在DB中为给定的$ relEntId设置),但是这次Doctrine在flush时发出错误信号,因为它有一个未经存在的实体。

基本上,我想要做的是创建一个关系而不知道任何关联,但相关实体的Id。如果还有其他方法可以做到,请分享。

提前致谢

编辑:

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

  1. 使用entityManager查找所有RelatedEntities;
  2. 将列表注入将要创建新实体的对象
  3. 创建新实体时,从列表中选择一个RelatedEntities作为其RelatedEntity
  4. 我会将问题保持开放一两天,以防万一有人提出更好的建议。

3 个答案:

答案 0 :(得分:4)

使用实体代理:

Entity::setRelatedEntity($entityManager->getReference('RelatedEntity', $relEntId))

答案 1 :(得分:1)

我不认为这应该像你描述的那样工作:)

您添加的实体必须是Doctrine托管对象,这意味着您必须先使用find()系列方法自行加载它。

答案 2 :(得分:0)

根据我对Doctrine 2的经验,在此进一步阐述http://ssmusoke.wordpress.com/2012/03/25/doctrine2-day-3-proxies-associations-relationships/

我的方法如下:

a)只有$ relatedEntity属性

b)添加一个getRelatedEntityId()函数,该函数从$ relatedEntity返回id值

c)添加一个setRelatedEntityId()来设置$ relatedEntity对象 - 您可能需要从数据库中加载它,当您只拥有相关实体的ID时,可以避免污染其他层

d)添加getRelatedEntity()和setRelatedEntity()函数

BOTTOM LINE:当Doctrine混淆时,你不能拥有外键列和映射属性的属性