【问题标题】:Doctrine2 - using a foreign key column as a normal fieldDoctrine2 - 使用外键列作为普通字段
【发布时间】:2012-05-28 06:51:43
【问题描述】:

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

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. 创建新实体时,从列表中选择一个相关实体作为其相关实体

我会把这个问题留一两天,以防有人提出更好的建议。

【问题讨论】:

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


    【解决方案1】:

    使用实体代理:

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

    【讨论】:

    • 问题是,其他域对象会创建新的实体,我不想在域中引入实体管理器。
    • 没关系。他的回答仍然有效。当您使用getReference() 时,您将获得与您的实体相同类的对象。因此,您可以使用来自$em->getReference() 的返回值,也可以使用在您的域中创建的实际对象。您的域不需要了解 Doctrine,类型提示仍然有效。
    • @Pinetree 您可以随时添加另一层。创建一个了解 EM 并创建域对象的实体工厂(这是很好的 OOP 设计)。
    • @Meze,好吧,现在我没有时间重新设计,我已经按照主帖编辑中的描述处理了它,但是工厂方法似乎还可以,如果我以后也会遇到同样的情况。
    【解决方案2】:

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

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

    【讨论】:

    • 我想了这么多,但我会再搁置一段时间,也许有人有一些解决方法或什么的......有没有办法阻止教义对不坚持实体发牢骚,就像第二部分中描述的那样?这仅适用于这种情况,我不想抑制所有持久性错误。
    • @Pinetree 请看一下 meze 的答案,它完全符合您的要求,并且不会破坏不了解 Doctrine 的域的要求。如果您需要更多说明,我相信我们中的一个可以提供帮助。
    【解决方案3】:

    根据我对 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 会混淆

    【讨论】:

    • 当我回复 meze 时,要让 setRelatedEntityId() 像这样工作,我必须将 entityManager 注入实体,我不想这样做。
    • 我使用了一个实用函数 loadEntity('ClassName', idvalue),它从单例实例中加载实体管理器,从数据库中加载具有 idvalue 的指定类的对象并返回它。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多