doctrine 2 ODM防止重复记录

时间:2011-06-17 01:04:55

标签: php mongodb doctrine-orm

Doctrine NOOB在这里,试图弄清楚如何防止嵌入许多属性中的重复记录。我有一个像这样的EmbededDocment:

<?
/**
 * @EmbeddedDocument
 */
class Contact {
/**
 * @Id
 */
private $id;

/**
 * created timestamp
 * @Date
 */
private $created;

/**
 * modified timestamp
 * @Date
 */
private $modified;

/**
 * @String
 */
private $name;

 /**
 * @String
 */
private $name;

 /**
 * @String
 */
private $address;
 }

我想要发生的是当我添加新联系人时,两个联系人可以具有相同的名称,两个联系人可以具有相同的地址,但是两个联系人不能具有相同的名称和地址。检查重复项时,doctrine将需要忽略$ id,$ created和$ modified属性,因为这些属性几乎总是不同的。它是必须唯一的所有其他字段的组合。如何使用doctrine 完成这个逻辑是属于服务层还是教条可以为我做?

更新 我确实接受安德鲁的回答是使用Mongo检查重复的正确方法,我真的想知道教义是否可以为我做这个。因此,我正在开始赏金。

2 个答案:

答案 0 :(得分:1)

您应该在保存之前验证文档。

例如,如果用户添加名称=“姓名”和地址=“地址”的联系人,则应检查mongodb是否存在此类联系人。如果它存在,您只显示验证消息,否则您将联系人添加到嵌入式联系人数组。

因此,假设您拥有包含嵌入式联系人数组的用户集合。要验证是否存在新联系人,您可以发送以下请求:

db.users.find({ userId: "userId" , 
                contacts.name: "new contact name", 
                contacts.address: "new contact address"}).count();

如果以上查询将返回计数&gt; = 1,则无需添加新联系人,只需显示验证。

答案 1 :(得分:1)

您可以实现一个事件监听器,它将监听preUpdate和prePersist事件。 http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/reference/events.html

在您的活动中,您可以自行检查。