2011-06-17 20 views
5

Noob de Doctrine aquí, tratando de descubrir cómo evitar un registro duplicado en una propiedad incrustada. Tengo un EmbededDocment así:doctrine 2 ODM que evita el registro duplicado

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

lo que quiero que suceda es cuando añado un nuevo contacto, dos contactos pueden tener el mismo nombre, dos contactos puede tener la misma dirección, pero dos contactos no puedo tener el mismo nombre y dirección Al verificar si hay duplicados, la doctrina deberá ignorar las propiedades $ id, $ created y $ modified, ya que casi siempre serán distintas. Es la combinación de todos los otros campos que deben ser únicos. ¿Cómo puede lograrse esto usando la doctrina? ¿Esta lógica pertenece a una capa de servicio o puede hacerlo la doctrina por mí?

ACTUALIZACIÓN: Yo acepto que la respuesta de Andrew es la forma correcta para comprobar si hay duplicación utilizando Mongo, realmente quiero saber si la doctrina puede hacer esto por mí. Por lo tanto, estoy comenzando una recompensa.

+0

Encontré útil esta publicación: http://stackoverflow.com/questions/3967226/checking-for-duplicate-keys-with-doctrine-2 –

Respuesta

1

Puede implementar un detector de eventos que escuche un evento preUpdate y prePersist. http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/reference/events.html

En su caso, puede hacer su propio control.

+0

Me inclino a hacer esto en el documento principal ... También voy a investigar cómo hacerlo en una clase de repositorio personalizada ... preferiría hacerlo en la propia entidad imo – Fatmuemoo

+1

Tienes razón, no lo hagas haz eso en la entidad. Estaba hablando sobre la sección 13.5 sobre la implantación del oyente de eventos, y no sobre las devoluciones de llamadas del ciclo de vida. – Reuven

+0

¡Sí! Creo que esto es lo que estoy buscando. Es una clase externa que puede manejar un evento. Me gusta. – Fatmuemoo

1

Debe validar su documento antes de guardarlo.

Por ejemplo, si el usuario agrega Contact with name = "Name" and address = "Address" debe comprobar en mongodb si existe dicho contacto. Y en caso de que exista, solo muestra el mensaje de validación, de lo contrario, se agrega el contacto a la matriz de contactos incrustados.

Supongamos que tiene una colección de usuarios que contiene un conjunto de contactos incrustados. Para verificar que existe nuevo contacto/no existe puede enviar solicitud de la siguiente manera:

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

Si anteriormente consulta devolverá contador> = 1 que no hay necesidad de agregar nuevo contacto, simplemente mostrar validación.

+1

¡SÍ! Sé cómo hacerlo usando mongo. Pero, ¿puede Doctrine hacer esto por mí? No quiero poner tal lógica en la entidad, entonces, ¿a dónde va? Pero realmente espero que la doctrina pueda hacerlo por mí. – Fatmuemoo

+1

@Fatmuemoo: puede crear algún servicio y poner allí la lógica de validación. Supongo que esa doctrina no puede hacer esto por usted, pero yo no soy experto en doctrina. –

Cuestiones relacionadas