我想在我的Doctrine 2实体中创建一个唯一约束,name
& test
是唯一的列。含义
OBJ1
OBJ2
这会在测试重复时触发错误。
我尝试使用唯一约束(Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity
)。试过
* @UniqueEntity("name")
* @UniqueEntity("test")
和
* @UniqueEntity({"name", "test"})
当我有两个名称和测试重复时,两者似乎只会触发错误。例如。
OBJ1
OBJ2
什么是正确的设置?或者我可能在某处犯了错误?
也许我应该包括像:
这样的学说注释@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) {
}
}
但是我确实在数据库层上遇到有关唯一约束的错误。那么我应该如何让Validation层工作呢?
答案 0 :(得分:50)
分别检查字段:
@UniqueEntity("name")
@UniqueEntity("test")
也就是说,当存在重复的name
值时,第一个会被触发,而当第二个值时,会有test
个重复值。
如果您希望 name
和test
包含相同的组合时验证失败,请使用此选项:
@UniqueEntity({"name", "test"})
对于你想要的东西,第一种方法应该有效 - 除非你在其他地方做错了。还要尝试清除缓存以确保它不是它的错误。
<强>更新强>
我建议的是关于应用程序方面的验证部分。如果使用Doctrine生成数据库模式,则需要为每个列提供Doctrine级别注释 - 如果您想使它们彼此独立,那么当然:
@Column(type = "string", unique = true)
private $name;
@Column(type = "string", unique = true)
private $test;
这些方法相互补充 - 不排除。 @UniqueEntity
确保副本甚至不会到达数据库层,而@Column
确保重复数据库层,数据库层不会让它通过。
答案 1 :(得分:49)
在表格注释中,您还可以设置多个columns的索引。
/** * @ORM\Entity * @ORM\Table(name="ecommerce_products",uniqueConstraints={ * @ORM\UniqueConstraint(name="search_idx", columns={"name", "email"})}) */
或使用YAML格式:
Namespace\Entity\EntityName:
type: entity
table: ecommerce_products
uniqueConstraints:
uniqueConstraint:
columns: [name, email]