我想在我的Doctrine 2实体中创建一个唯一约束,使得name
和test
在列级别上是唯一的。意味着:
对象1
- 名称:name1
- 测试:test
对象2
- 名称:name2
- 测试:test <---- 重复了
这应该会触发一个错误,因为test被重复了。
我尝试使用唯一约束(Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity
),尝试了
* @UniqueEntity("name")
* @UniqueEntity("test")
并且 * @UniqueEntity({"name", "test"})
当我同时复制name和test时,两者似乎只会触发错误。例如:
obj1
- name: name1
- test: test
obj2
- name: name2
- test: test
应该如何正确设置?还是我可能犯了某些错误?
也许我应该包含Doctrine注释,例如:
@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) {
}
}
但是我在数据库层面收到了关于唯一约束的错误。那么我该如何让验证层正常工作呢?
test
重复了吗? - Jiew Meng$test
字段在哪里?我在类中没有看到它。 - Elnur Abdurrakhimov