Unique de la Doctrina 2, Symfony 2

Quiero hacer una restricción única en mi Doctrina 2 entidad que name & test son únicos de la columna sabio. Significado

  • obj1

    • nombre: apellido1
    • de prueba: prueba de
  • obj2

    • nombre: nombre2
    • de prueba: prueba de <—- duplicado

Esto debería desencadenar un error como prueba está duplicado.

He intentado utilizar la restricción unique (Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity). Trató de

 * @UniqueEntity("name")
 * @UniqueEntity("test")

y

 * @UniqueEntity({"name", "test"})

Ambos parecen provocar error cuando tengo el nombre y en la prueba de duplicados. por ejemplo.

  • obj1

    • nombre: apellido1
    • de prueba: prueba de
  • obj2

    • nombre: nombre2
    • de prueba: prueba de

Cuál es la configuración correcta? O podría haber cometido un error en alguna parte?

Quizás debería incluir la doctrina de anotación como:

@Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})

Pero que todavía no manejar mi symfony formulario de validación creo?

ACTUALIZACIÓN

Mi código de prueba:

/**
 * @ORM\Entity
 * @ORM\Table(name="roles") 
 * @UniqueEntity("name")
 * @UniqueEntity("test")
 */
class Role {

    /**
     * @var integer
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @var string
     * 
     * @ORM\Column(type="string", length=32, unique=true)
     * @Assert\MaxLength(32)
     * @Assert\Regex("/^[a-zA-Z0-9_]+$/")
     */
    protected $name;

}

$v = $this->get('validator');

$role = new Role();
$role->setName('jm');
$role->setTest('test');
$e = $v->validate($role);
echo '=== 1 ===';
var_dump($e);
if (count($e) == 0)
    $em->persist($role);            

$role2 = new Role();
$role2->setName('john');
$role2->setTest('test');
$e = $v->validate($role2);
echo '=== 2 ===';
var_dump($e);
if (count($e) == 0)
    $em->persist($role2);

$em->flush();

De la primera ejecución (tabla vacía):

=== 1 ===object(Symfony\Component\Validator\ConstraintViolationList)#322 (1) {
  ["violations":protected]=>
  array(0) {
  }
}
=== 2 ===object(Symfony\Component\Validator\ConstraintViolationList)#289 (1) {
  ["violations":protected]=>
  array(0) {
  }
}

Pero tengo un error en la capa de base de datos acerca de la restricción unique. Entonces, ¿cómo puedo obtener la Validación de la capa de trabajo tho?

  • En el segundo ejemplo, ninguno de los campos se duplican. Hace su pregunta un poco confuso.
  • test se duplica?
  • Oops lo siento. Pero antes, te dicen «Tanto». Entonces, ¿cuál es el asunto con el segundo ejemplo ?
  • Probablemente, usted debe anexar el ejemplo y con algo así como «no provocar ningún error».
  • en la 2ª ejemplo, test se duplica. Espero un error de validación.
  • Donde es el $test campo? Yo no lo veo en la clase.

InformationsquelleAutor Jiew Meng | 2011-12-17

2 Kommentare

  1. 50

    Estos verificación de los campos de forma individual:

    @UniqueEntity("name")
    @UniqueEntity("test")

    Que es, el primero obtendrá activa cuando hay un duplicado name valor, mientras que el segundo — cuando hay un duplicado test valores.

    Si quieres la validación de error cuando tanto name y test contienen el mismo combinación, utilice esto:

    @UniqueEntity({"name", "test"})

    Por lo que desea que el primer enfoque debe trabajar — a menos que usted hizo algo mal en alguna otra parte. También intenta borrar la caché para asegurarse de que no es su culpa.

    ACTUALIZACIÓN

    Lo que me sugirió fue acerca de la validación de la parte en la aplicación. Si se genera el esquema de base de datos utilizando la Doctrina, debe proporcionar la Doctrina nivel de anotaciones para cada columna — si usted desea hacen únicas de forma independiente el uno del otro, por supuesto:

    @Column(type = "string", unique = true)
    private $name;
    
    @Column(type = "string", unique = true)
    private $test;

    Estos métodos se complementan el uno al otro — no excluir. @UniqueEntity asegura un duplicado no le llega ni a la capa de base de datos, mientras que @Column asegura que si lo hace, la capa de base de datos no la dejen pasar.

    • Extraña cosa es UniqueEntity, no funciona! Se desencadena un error sólo cuando ambos campos duplicados, ver mis actualizaciones sobre la cuestión principal pronto
    • Si quería usar @UniqueEntity, donde en mi código debo poner?
    • en la clase de entidad.
    • 1 upvote este también explica diferencia entre @UniqueEntity y @Column(unique=true)
  2. 51

    En la Mesa de anotación, también puede establecer un índice para varios columnas.

    /** 
    * @ORM\Entity 
    * @ORM\Table(name="ecommerce_products",uniqueConstraints={ 
    * @ORM\UniqueConstraint(name="search_idx", columnas={"nombre", "email"})}) 
    */
    

    o con el formato YAML:

    Namespace\Entity\EntityName:
        type: entity
        table: ecommerce_products
        uniqueConstraints:
            uniqueConstraint:
                columns: [name, email]
    • Y cuando el campo está en una relación con otra tabla? Como private $author. No se puede poner ni el autor o author_id en el único. ¿Cómo puedo solucionarlo?
    • si s lonked a anothed entidad que usted puede agregar: «myEntity_id». una pregunta para @-yvoyer: ¿cómo se puede agregar una costum mensaje ? ( o cómo conseguir paseo de la página de error ? )
    • Creo que la definición de la restricción basada en la joinned columna sería todavía funciona. ex. Dado que tienen un atributo definido @JoinColumn(name="customer_id", referencedColumnName="id"), especificando la customer_id en la restricción debe trabajar… Mi conjetura es que la única limitación es el uso de las definiciones de mysql no php. Lo que quiero decir es que la única restricción que debe tener el nombre de la base de la columna customer_id, no el PHP atributo $customer.
    • no estoy seguro que entiendo la pregunta acerca de las páginas de error y un mensaje personalizado? No parece ser relevante para la pregunta actual.
    • si desea comprobar entidades relacionadas, todavía hay que poner el nombre del php o llegue ese error: The field "country_id" is not mapped by Doctrine, so it cannot be validated for uniqueness.. el uso de este: * @UniqueEntity({"country_id", "product_id"}) con los campos: * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", inversedBy="products") * @ORM\JoinColumn(name="country_id", referencedColumnName="id", nullable=true, onDelete="set null") */ protected $country;
    • Este es por lejos la mejor respuesta como entidad única que está destinado a ser utilizado para la validación de formularios, etc) wherease doctrina restricciones en el nivel de base de datos. Ambos deben ser utilizados en combinación.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea