Уникальные ограничения в Doctrine 2, Symfony 2

Я хочу создать уникальное ограничение в моей сущности Doctrine 2, чтобы name и test были уникальными по столбцам. Значение

  • obj1

    • name: name1
    • test: test
  • obj2

    • name: name2
    • test: test <---- duplicated

Это должно вызвать ошибку, так как test продублирован.

Я пробовал использовать уникальное ограничение ( Symfony \ Bridge \ Doctrine \ Validator \ Constraints \ UniqueEntity ). Пробовал

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

и

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

Оба, кажется, вызывают ошибку только тогда, когда у меня дублируются ОБЕИ имя и тест. например.

  • obj1

    • name: name1
    • test: test
  • obj2

    • name: name2
    • test: test

Какая правильная настройка? Или я мог где-то ошибиться?

Возможно, мне следует добавить аннотацию к доктрине, например:

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

Но я думаю, это все еще не будет обрабатывать мою проверку формы Symfony?

ОБНОВЛЕНИЕ

Мой тестовый код:

/**
 * @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();

При первом запуске (пустая таблица):

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

Но я получаю ошибку на уровне базы данных об уникальном ограничении. Итак, как мне заставить работать уровень валидации?

29
задан Jiew Meng 18 December 2011 в 01:03
поделиться