Clave unica y update

Hola, tengo un problema con doctrine al intentar actualizar una tabla, la tabla tiene tres claves unicas, por lo cual al hacer el update peta, ya que toma los valores antiguos como repetidos, esta actualizacion la hago con merge, hay alguna solucion a parte de borrar antes y guardar despues. UNn saludo.

Respuestas

#1

Si entiendo bien la pregunta, tienes una tabla en la que su clave primaria es compuesta y toma el valor de tres columnas diferentes. Nunca he usado Doctrine con una clave compuesta por tres valores, pero sí con dos valores y todo funcionó como si fuera una clave simple. Si nos muestras algo del código que estás usando para hacer las consultas, quizás podamos ayudarte.

#2

Gracias, te explico, la clave primaria es la id, pero tengo tres campos teléfono, email, DNI que son únicos. Cuando intento hacer un update no me deja ya que al reenviar alguno de estos 3 campos que no han sido modificados me devuelve un error de campo repetido y no me deja actualizar.

Una solución que veo es la de borrar y crear de nuevo con la misma id, pero no creo que sea una buena práctica; otra opción que veo es quitar el unique a estos campos y comprobar que no se repitan mediante código, lo que me gustaría saber es si hay alguna otra solución más correcta para este problema.

Un saludo.

#3

Había entendido mal tu pregunta. No tienes una clave primaria compuesta, sino tres campos que están marcados como unique en la base de datos.

En primer lugar, si lo que estás haciendo es actualizar la información de una entidad, este error no se debería producir ... a menos que estés modificando uno de esos tres valores (por ejemplo el DNI) y el nuevo valor ya exista en la base de datos.

En cualquier caso, parece que en tu aplicación quieres que la combinación de esos tres valores sea única. En otras palabras, dos registros de la base de datos pueden tener por ejemplo el mismo DNI y teléfono, pero entonces el email tiene que ser diferente.

Si es así, te aconsejo que te olvides de los unique de la base de datos, porque no te va a dejar hacerlo. Por suerte, Symfony incluye una validación que es justo lo que necesitas. Suponiendo que la entidad se llame usuario, tienes que añadir la siguiente anotación @UniqueEntity:

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
 
/**
 * @ORM\Entity
 * @UniqueEntity("dni", "email", "telefono")
 */
class Author
{
    // ...
}

En este artículo de la documentación oficial de Symfony está mejor explicado.

#4

Ok gracias, eres de gran ayuda