2011-06-17 132 views
5

学说NOOB在这里,试图找出如何防止嵌入多个属性中的重复记录。我有这样一个EmbededDocment:doctrine 2 ODM防止重复记录

<? 
/** 
* @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; 
} 

我希望发生的是,当我添加新的联系人,两个触点可以有相同的名字,两个触点可以有相同的地址,但两个触点不能具有相同的名称和地址。当检查重复时,教义将需要忽略$ id,$ created和$ modified属性,因为它们几乎总是不同的。它是所有其他领域的组合,必须是唯一的。这怎么可以用原理这个逻辑属于服务层还是可以主义为我做?

UPDATE: 我不接受,安德鲁的回答是正确的方法来检查使用蒙戈重复,我真的很想知道,如果学说能为我做到这一点。因此,我开始赏金。

+0

我发现这篇文章很有用:http://stackoverflow.com/questions/3967226/checking-for-duplicate-keys-with-doctrine-2 – 2011-12-21 16:57:24

回答

1

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

在你的活动中,你可以做你自己的支票。

+0

我倾向于这样做的母公司文件...我也将调查这样做在自定义回购类...这将更喜欢做它在实体本身imo – Fatmuemoo 2011-06-22 20:14:31

+1

你是对的,不要在实体中这样做。我在谈论关于植入事件监听器的13.5节,而不是关于生命周期回调。 – Reuven 2011-06-22 21:34:29

+0

是的!我认为这是我正在寻找的。它是一个可以处理事件的外部类。我喜欢。 – Fatmuemoo 2011-06-22 23:53:36

1

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

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

因此,假设您拥有包含嵌入式联系人数组的用户集合。要验证新的接触存在/不存在,你可以像这样发送请求:

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

如果上面的查询将返回计数> = 1,则没有必要添加新的联系人,只是显示的验证。

+1

是的!我知道如何使用mongo来做到这一点。但是,教义能为我做这件事吗?我不想把这种逻辑放在实体中,那么它到底在哪里?但我真的希望这个教义能为我做到。 – Fatmuemoo 2011-06-17 12:37:37

+1

@Fatmuemoo:你可以创建一些服务并在那里放置验证逻辑。我想这个教义不能为你做到这一点,但我不是教条的专家。 – 2011-06-19 08:29:05