【发布时间】:2012-01-22 15:39:29
【问题描述】:
我想在我的 Doctrine 2 实体中创建一个唯一约束,以便 name 和 test 在列方面是唯一的。意义
-
obj1
- 姓名:姓名1
- 测试:测试
-
obj2
- 姓名:姓名2
- 测试:测试
这应该会在测试重复时触发错误。
我尝试使用唯一约束 (Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity)。试过了
* @UniqueEntity("name")
* @UniqueEntity("test")
和
* @UniqueEntity({"name", "test"})
似乎只有在我的名称和测试都重复时才会触发错误。例如。
-
obj1
- 姓名:姓名1
- 测试:测试
-
obj2
- 姓名:姓名2
- 测试:测试
什么是正确的设置?或者我可能在某个地方犯了错误?
也许我应该包括如下教义注释:
@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) {
}
}
但我确实在数据库层收到关于唯一约束的错误。那么我应该如何让验证层工作呢?
【问题讨论】:
-
在您的第二个示例中,没有一个字段是重复的。这让你的问题有点不清楚。
-
@gre0ire,
test重复? -
糟糕,抱歉。但在此之前,您会说“两者”。那么第二个例子有什么问题呢?
-
你可能应该在你的例子后面加上“不会触发任何错误”之类的东西。
-
@greg0ire,在第二个例子中,
test是重复的。我预计会出现验证错误。
标签: validation symfony doctrine-orm