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
我正在寻找一种优雅的方式来实现目标:
你有没有找到解决办法?我现在陷入困境。@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();