2011-09-03 9 views
8

So che posso sempre impostare una chiave DB univoca utilizzando lo schema MYSQL ma era solo curioso che la dottrina di ORM ti permettesse di impostare una colonna come unica nel codice?C'è un modo per applicare una colonna univoca usando doctrine2?

Ad esempio, come posso farlo in codice in modo che il nome utente sia univoco nel codice in fase di esecuzione?

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; 
     } 

risposta

19

Sto assumendo che questo è quello che vuoi?

<?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

Dal momento che non ho il codice non posso fare un esempio pratico.

+0

Ho aggiunto il codice come richiesto – jini

+1

È lo schema della tabella che è necessario modificare, guarda la documentazione che ho collegato a ... uniqueConstraints = {@ UniqueConstraint (name = "myname ", columns = {" username "}) sarebbe probabilmente quello che vuoi aggiungere nel tuo caso. – Andreas

+0

questa è una risposta migliore in quanto funziona in più circostanze – Dennis

2

è necessario impostare i vincoli uniq nella dichiarazione @Table

@UniqueConstraint

annotazione viene utilizzato all'interno l'annotazione @Table sul livello di entità di classe. Permette di suggerire a SchemaTool di generare un vincolo unico di database sulle colonne della tabella specificate. Ha significato solo nel contesto di generazione dello schema SchemaTool . attribuisce

richiesto: nome: nome dell'indice, colonne: Schiera delle colonne.

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

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

37

Basta fornire una soluzione alternativa che è un po 'più semplice.

Se si tratta di una singola colonna, si potrebbe semplicemente aggiungere una unica sulla definizione di colonna:

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

documentazione su questo: http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#column

Se avete bisogno di un indice univoco su più colonne, ancora bisogno di usare il metodo fornito da Andreas.

nota: non sono sicuro di quale versione sia disponibile. Potrebbe non essere ancora disponibile nel 2011.

Problemi correlati