2012-03-14 24 views
10

¿Cómo ignorar las entradas duplicadas con Doctrine2?insertar ignorar en entradas duplicadas en Doctrine2/Symfony2

ejemplo de error:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'symfony' for key 'UNIQ_389B783389B783' 
+0

Puede hacer lo propulsar hacer: realizar un método como findByKeyOrCreate(), devolviendo una entidad existente si lo hay, o la creación de una nueva si no. – gremo

+0

Elimina el índice '@ Unique' de ese campo, si no lo necesitas. –

+0

Obviamente lo necesito ... – seferov

Respuesta

11

Esa es una de las molestias de Doctrine, no es posible hacer INSERT/UPDATE Ignore, hay una solución alternativa como crear un método que verifique si la fila existe, y si lo hace, entonces sáltelo.

Puede ver la excepción, para que su secuencia de comandos no termine en una excepción. Sin embargo, el administrador de la entidad estará cerrado y ya no podrá usarlo. Sin embargo, aún puede usar PDO y puede insertar un registro en la base de datos que indique que su lote falló porque X y necesita reiniciarse (eso es lo que suelo hacer).

Si ninguna de las opciones anteriores funciona para usted, en última instancia, termino escribiendo SQL sin procesar para hacer un procesamiento por lotes y no uso Doctrine en absoluto, termina siendo más rápido y la capacidad de realizar INSERT/UPDATE Ignore hace es un pan comido.

9

Siempre se puede detectar la excepción y luego ignorarlo. Solo tenga en cuenta que cuando el administrador de la entidad genera una excepción, el administrador de la entidad ya no puede ser utilizado durante esa solicitud.

7

En Symfony 3 puede restablecer gerente y seguir trabajando con ella llamando al método de resetManager()Doctrine objeto después de la captura de UniqueConstraintViolationException excepción.

Aquí se muestra un ejemplo:

try { 
    $em = $this->getDoctrine()->getManager(); 
    $entity = Product::create() 
    ->setTitle('Some title') 
    ->setUrl('http://google.com'); 
    $em->persist($entity); 
    $em->flush(); 
} 
catch (UniqueConstraintViolationException $e) { 
    $this->getDoctrine()->resetManager(); 
} 
+1

¡Buena parte! (es decir, resetManager()) –

+1

Me interesaría recibir una respuesta más reciente de ese tipo. resetManager() ahora está en desuso. – Moonchild

+0

si está usando Symfony 3/4 use 'composer require symfony/proxy-manager-bridge' –

Cuestiones relacionadas