Sytrfony 2中的学说2中的唯一约束

Jie*_*eng 29 validation symfony doctrine-orm

我想在我的Doctrine 2实体中创建一个唯一的约束,以便name&test是唯一的列.含义

  • OBJ1

    • name:name1
    • 测试一下
  • OBJ2

    • 名称:name2
    • test:test <----重复

这应该会在测试重复时触发错误.

我尝试使用唯一约束(Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity).试着

 * @UniqueEntity("name")
 * @UniqueEntity("test")
Run Code Online (Sandbox Code Playgroud)

 * @UniqueEntity({"name", "test"})
Run Code Online (Sandbox Code Playgroud)

当我有两个名称和测试重复时,两者似乎只触发错误.例如.

  • OBJ1

    • name:name1
    • 测试一下
  • OBJ2

    • 名称:name2
    • 测试一下

什么是正确的设置?或者我可能在某个地方犯了错误?

也许我应该包括如下的学说注释:

@Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
Run Code Online (Sandbox Code Playgroud)

但是我觉得那仍然不能处理我的symfony表单验证?

UPDATE

我的测试代码:

/**
 * @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();
Run Code Online (Sandbox Code Playgroud)

在第一次运行(空表):

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

但我确实在数据库层上遇到有关唯一约束的错误.那么我应该如何让Validation层工作呢?

yvo*_*yer 51

在表注释中,您还可以为多个设置索引.

/**
 * @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]
Run Code Online (Sandbox Code Playgroud)


Eln*_*mov 50

这些单独检查字段:

@UniqueEntity("name")
@UniqueEntity("test")
Run Code Online (Sandbox Code Playgroud)

也就是说,当存在重复name值时,第一个将被触发,而当存在重复值时,第一个将被触发test.

如果你想验证失败时,双方 nametest包含相同的组合,您可以使用此:

@UniqueEntity({"name", "test"})
Run Code Online (Sandbox Code Playgroud)

对于你想要的东西,第一种方法应该有效 - 除非你在其他地方做错了.还要尝试清除缓存以确保它不是它的错.

UPDATE

我建议的是关于应用程序方面的验证部分.如果使用Doctrine生成数据库模式,则需要为列提供Doctrine级别注释- 如果要使它们彼此独立,当然:

@Column(type = "string", unique = true)
private $name;

@Column(type = "string", unique = true)
private $test;
Run Code Online (Sandbox Code Playgroud)

这些方法相互补充 - 不排除.@UniqueEntity确保副本甚至不会到达数据库层,同时@Column确保如果它没有,数据库层将不允许它通过.