4

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

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,但不会设置其他值。我不想持久化相关实体(它的值已经在数据库中为给定的 $relEntId 设置),但是这次 Doctrine 在刷新时发出错误信号,因为它有一个未持久化的实体。

基本上,我想做的是在不知道相关实体的 ID 的情况下创建关系。如果有其他方法可以做到这一点,请分享。

提前致谢

编辑:

我找到了解决方法。由于 RelatedEntities 将是一组有限的不可变对象,因此我执行了以下操作:

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

我会把这个问题留一两天,以防有人想出更好的东西。

4

3 回答 3

5

使用实体代理:

Entity::setRelatedEntity($entityManager->getReference('RelatedEntity', $relEntId))
于 2012-05-28T07:12:29.137 回答
2

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

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

于 2012-05-28T07:00:46.653 回答
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() 函数

底线:您不能拥有外键列和映射属性的属性,因为 Doctrine 会混淆

于 2012-05-28T07:13:53.160 回答