Есть ли способ применить уникальный столбец, используя doctrine2? - PullRequest
13 голосов
/ 03 сентября 2011

Я знаю, что всегда могу установить уникальный ключ БД, используя схему MYSQL, однако было просто любопытно, если бы ORM-подобная доктрина позволяла вам установить столбец как уникальный в коде?

Например, как я могу сделать это вкод, чтобы имена пользователей были уникальными в коде во время выполнения?

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

Ответы [ 3 ]

57 голосов
/ 19 февраля 2015

Просто предоставление альтернативного решения, которое немного проще.

Если это один столбец, вы можете просто добавить уникальный в определение столбца:

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

Документация по этому вопросу: https://www.doctrine -project.org / проекты / Доктрина-ОРМ / ы / 2,6 / ссылки / аннотации-reference.html # annref_column

Если вам нужен уникальный индекс для нескольких столбцов, вам все равно нужно использовать предоставленный Андреас метод.

примечание: я не уверен, с какой версии это доступно. Возможно, это еще не было доступно в 2011 году.

22 голосов
/ 03 сентября 2011

Я предполагаю, что это то, что вы хотите?

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

http://www.doctrine -project.org / документы / ОРМ / 2,0 / о / ссылка / аннотации-reference.html # annref-UniqueConstraint

Поскольку у меня нет вашего кода, я не могу привести практический пример.

2 голосов
/ 03 октября 2012

Вы должны установить уникальные ограничения в объявлении @ Table

@ UniqueConstraint

Аннотация используется внутри аннотации @Table класса сущностей уровень. Это позволяет намекнуть на SchemaTool для создания уникальной базы данных ограничение на указанные столбцы таблицы. Это имеет значение только в Контекст создания схемы SchemaTool.

Обязательные атрибуты : имя : название индекса, столбцы : массив столбцов.

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

источник: http://docs.doctrine -project.org / projects / doctrine-orm / en / 2.1 / reference / annotations-reference.html # annref-uniqueconstraint

...