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检查重复的正确方法,我真的想知道教义是否可以为我做这个。因此,我正在开始赏金。
答案 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
在您的活动中,您可以自行检查。