Php 是否可以使用值对象作为ODM原则实体的id?

Php 是否可以使用值对象作为ODM原则实体的id?,php,doctrine-odm,ddd-repositories,Php,Doctrine Odm,Ddd Repositories,我有一个Subscription实体,它代表了Twitter中用户之间的多对多关系,就像下面的模型一样。它具有代理项ID以确保关系的唯一性,该关系由值对象SubscriptionId表示SubscriptionId作为Mongobinda保存。以下是XML描述: <document name="Subscription" collection="users.subscriptions" repository-class="SubscriptionRe

我有一个
Subscription
实体,它代表了Twitter中用户之间的多对多关系,就像下面的模型一样。它具有代理项ID以确保关系的唯一性,该关系由值对象
SubscriptionId
表示
SubscriptionId
作为
Mongobinda
保存。以下是XML描述:

<document name="Subscription"
          collection="users.subscriptions"
          repository-class="SubscriptionRepository">
    <field name="id" id="true" type="User.Subscription.Id"/>
    <field name="u" fieldName="userId" type="User.Id"/>
    <field name="t" fieldName="subscribedTo" type="User.Id"/>
    <field name="d" fieldName="dateTime" type="PreciseDateTime"/>
</document>
我尝试使用自定义id生成器,而不是在构造函数中设置
id
。但出于某种原因,ODM忽略了我的
type=“User.Subscription.Id”
,并将Id类型视为
custom\u Id
。我的实体具有
mongobinda
的实例,而不是所需的
SubscriptionId

我正在寻找一种优雅的方式来实现目标:

  • VO作为实体的id
  • 保留具有现有ID的新实体时出现重复异常

  • 你有没有找到解决办法?我现在陷入困境。@Oddman,不,我放弃了:(@Oddman,现在我使用字符串
    u
    t
    组合的唯一索引。我最终找到了答案-这只是你如何设置映射。基本上,你注册了一个新的“类型”将其UserId作为值对象,然后创建该类型的DQL映射,该映射知道如何获取实际值并进行转换(即,如果是字符串UUID,则获得要发送的字符串值)。然后它也知道如何将其转换回去。我花了一段时间才弄清楚它是如何工作的,但最终实现了。因此,现在我为每种类型的id(用户id、帖子id、内容id等)提供了值对象。您是手动创建id(例如在构造函数中)还是ODM为您创建id?
    $sub = new Subscription($subscriberId, $subscribedToId);
    
    $dm->persist($sub);
    $dm->flush();
    
    $dm->clear();
    
    $dm->persist($sub);
    $dm->flush();