2011-09-03 14 views
8

Sé que siempre puedo establecer una única clave de base de datos utilizando el esquema MYSQL. Sin embargo, era curioso si la doctrina de ORM le permitía configurar una columna para que fuera única en el código.¿Hay alguna manera de aplicar una columna única usando doctrine2?

Por ejemplo, ¿cómo puedo hacerlo en código para que los nombres de usuario sean únicos en el código en tiempo de ejecución?

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(300) COLLATE utf8_unicode_ci NOT NULL, 
    `email` varchar(300) COLLATE utf8_unicode_ci NOT NULL, 
    `password` varchar(300) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 






function insert_user($username,$email,$password) 
     { 
$user = new User(); 
$user->setUsername($username); //HOW CAN I MAKE THIS UNIQUE IN CODE? 
$user->setEmail($email); 
$user->setPassword($password); 

    try { 
      //save to database 
      $this->em->persist($user); 
      $this->em->flush(); 
     } 
     catch(Exception $err){ 

      die($err->getMessage()); 

      return false; 
     } 
     return true; 
     } 

Respuesta

19

Supongo que esto es lo que quieres?

<?php 
/** 
* @Entity 
* @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})}) 
*/ 
class ECommerceProduct 
{ 
} 

http://www.doctrine-project.org/docs/orm/2.0/en/reference/annotations-reference.html#annref-uniqueconstraint

Dado que no tengo el código no se puede dar un ejemplo práctico.

+0

Agregue el código como lo pidió – jini

+1

Es el esquema de la tabla que necesita cambiar, consulte la documentación que he vinculado ... uniqueConstraints = {@ UniqueConstraint (name = "myname ", columns = {" username "}) probablemente sería lo que desea agregar en su caso. – Andreas

+0

esta es una mejor respuesta, ya que funciona en más circunstancias – Dennis

2

tiene que configurar las restricciones en la declaración uniq @Table

@UniqueConstraint

anotación se utiliza dentro de la anotación en el @Table nivel de clase de entidad. Permite insinuar el SchemaTool para generar una base de datos única restricción en las columnas de la tabla especificada. Solo tiene significado en el contexto de generación de esquema SchemaTools . atribuye

Obligatorio: nombre: Nombre del índice, columnas: Arsenal de columnas.

<?php 
/** 
* @Entity 
* @Table(name="user",uniqueConstraints={@UniqueConstraint(name="username_uniq", columns={"username"})}) 
*/ 
class User 
{ 
    /** 
    * @Column(name="username", length=300) 
    */ 
    protected $username; 
} 

fuente: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/annotations-reference.html#annref-uniqueconstraint

37

limitarse a proporcionar una solución alternativa que es un poco más simple.

Si se trata de una sola columna, usted podría simplemente una solución única en la definición de la columna:

class User 
{ 
    /** 
    * @Column(name="username", length=300, unique=true) 
    */ 
    protected $username; 
} 

Documentación sobre esto: http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#column

Si necesita un índice único en varias columnas, Todavía es necesario utilizar el método proporcionado por Andreas.

nota: No estoy seguro desde que versión está disponible. Puede ser que todavía no esté disponible en 2011.

Cuestiones relacionadas