Doctrine 2 ODM如何防止重复记录。

6

我是一个Doctrine的新手,正在尝试找出如何在嵌入多个属性中防止重复记录。我有一个像这样的嵌入文档:

<?
/**
 * @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实现这一点?这个逻辑应该放在服务层还是Doctrine可以为我完成?

更新: 我接受安德鲁的答案是使用Mongo检查重复的正确方法,但我真的想知道Doctrine是否能够为我完成这项任务。因此,我开始了一个悬赏。


我发现这篇帖子很有用:https://dev59.com/iG865IYBdhLWcg3wIrBg - Eric Corriel
2个回答

1

我倾向于在父文档上执行此操作...我还将调查在自定义存储库类中执行此操作...在我的看法中,这比在实体本身中执行要好。 - Fatmuemoo
1
你说得对,在实体中不要这样做。我是在谈论13.5节关于实现事件监听器,而不是生命周期回调。 - Reuven
是的!我认为这就是我正在寻找的。它是一个可以处理事件的外部类。我喜欢它。 - Fatmuemoo

1

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

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

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

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

如果上述查询返回计数>= 1,则无需添加新联系人,只需显示验证即可。

1
是的!我知道如何使用mongo来做到这一点。但是Doctrine能否为我完成这个任务呢?我不想把这样的逻辑放在实体中,那么它应该放在哪里呢?但我真的希望Doctrine可以为我完成这个任务。 - Fatmuemoo
1
@Fatmuemoo:你可以创建一些服务并在那里放置验证逻辑。我猜Doctrine不能为你完成这个,但我不是Doctrine的专家。 - Andrew Orsich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接