如何在Doctrine MongoDB中注释子文档?

时间:2013-07-27 01:16:53

标签: mongodb symfony doctrine-odm doctrine-mongodb

我想实现应该模拟以下内容的php类: (Symfony的,DoctrineMongoDBBundle)

Notification Collection { from { id , fname } , to , sentDate }

Member Collection { id , fname , lname , email , phone , regDate , ... }

我想告诉ODM:“from field是一个只包含2个值的对象,发送者的id和他的fname”

我必须使用什么注释?我应该定义另一个类如from.php吗?或者我可以创建两个类,如下所示:

/*
 *@Document
 */
class Notification {
/*
 *@Id
 */
protected $id;

/*
 *@EmbedOne(targetDocument="Member")
 */
protected $from;

/*
 *@ReferenceOne(targetDocument="Member")
 */
protected $to;

/*
 *@Date
 */
protected $sentDate;
}


/*
 *@Document
 */
class Member {
/*
 *@Id
 */
protected $id;

/*
 *@String
 */
protected $fname;

/*
 *@String
 */
protected $lname;

/*
 *@String
 */
protected $email;

.
.
.
}

如果它是正确的,在我的控制器中如何控制“from”字段以仅保存Member对象的id和fname? 假设:

$senderUser;
$newNotification = new Notification();
$newNotification->setFrom($senderUser);

然后$ newNotification->从set到一个Member对象,其中包含有关Member的所有信息。但是我只希望发送者的id和fname保持不变! (因为我的项目的需要) 请原谅我的英语语法错误。 谢谢你的帮助...

1 个答案:

答案 0 :(得分:0)

如果您坚持在from字段中嵌套通知的原始用户ID和名字,那么您需要与From文档建立Embed One关系,而From文档又包含以下字段:< / p>

  • id:这应该是与会员文档的Reference One关系。我建议使用simple选项作为参考,这样您只存储会员的ID值,而不是DBRef对象。
  • fname:这应该是一个字符串字段。 ODM无法使其与参考的会员文档保持同步,因此您需要自行确保。

就个人而言,通知文档似乎足够小,我只需直接在通知上创建fromMemberfromMemberFirstName字段。然后,您可以在setFromMember()方法中添加一些逻辑,该方法还会从传递的Member参数中设置fromMemberFirstName字段。

如果您想更进一步,可以使用events来监控成员对象中已更改的fname字段,并发出查询以更新通知文档,但这是一个单独的对话。