2011-09-03 6 views
8

Wiem, że zawsze mogę ustawić unikalny klucz DB, używając schematu MYSQL, ale byłam ciekawa, czy doktryna ORM pozwala ci ustawić kolumnę jako niepowtarzalną w kodzie?Czy istnieje sposób na wymuszenie unikatową kolumnę za pomocą doktryny2?

Na przykład, jak mogę zrobić to w kodzie, aby nazwa użytkownika była unikalna w kodzie w czasie wykonywania?

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

Odpowiedz

19

Zakładam, że tego właśnie chcesz?

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

Ponieważ nie mam kodu nie mogę dać praktyczny przykład.

+0

Dodałem kod, o który prosiłeś. – jini

+1

Jest to schemat tabeli, który musisz zmienić, spójrz na dokumentację, z którą połączyłem ... uniqueConstraints = {@ UniqueConstraint (name = "myname ", columns = {" username "}) będzie prawdopodobnie tym, co chcesz dodać w swojej sprawie. – Andreas

+0

to jest lepsza odpowiedź, ponieważ działa w większej liczbie okoliczności – Dennis

2

Musisz ustawić Uniq ograniczeń w deklaracji @Table

@UniqueConstraint

Adnotacja jest używany wewnątrz @Table adnotacji na podmiot klasy poziomie. Umożliwia wskazanie narzędzia SchemaTool w celu wygenerowania unikalnego ograniczenia bazy danych w określonych kolumnach tabeli. Ma tylko znaczenie w kontekście generowania schematu SchemaTool .

wymagane atrybuty: nazwa: Nazwa Indeksu, kolumny: Array kolumn.

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

źródło: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/annotations-reference.html#annref-uniqueconstraint

37

Wystarczy zapewniając alternatywne rozwiązanie, które jest trochę prostsze.

Jeśli jest to pojedyncza kolumna, można po prostu dodać unikatowy na definicji kolumna:

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

dokumentacja na to: http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#column

Jeśli potrzebujesz unikalny indeks na wielu kolumnach, ty nadal trzeba korzystać z metody dostarczonej przez Andreasa.

uwaga: Nie jestem pewien, od której wersji jest to dostępne. Być może nie było to jeszcze dostępne w 2011 roku.