Symfony2 UniqueEntity验证约束为连接?

时间:2012-03-21 19:23:15

标签: forms validation symfony symfony-forms

在我的Tag实体中,我需要避免在给定用户创建的所有标记中创建具有相同name的标记。与User实体存在多对一关系,名为user

我在数据库(使用uniqueConstraints)和使用UniqueEntity的表单验证中强制执行此约束。但我无法理解Symfony2 documentation中有关此约束的这句话:

  

此必填选项是字段(或字段列表)   实体应该是唯一的。例如,您可以指定两者   上述用户示例中的电子邮件和名称字段应该是唯一的。

但我需要nameuser 作为一个整体。这可能吗?怎么样?下面是一个不工作的例子:名称和用户都被检查为奇异字段的唯一性。

/**
 * @ORM\Entity(repositoryClass="Acme\HelloBundle\Repository\TagRepository")
 * @ORM\Table(
 *     name="tag",
 *     uniqueConstraints={
 *         @ORM\UniqueConstraint(columns={"name", "user_id"}),
 *     })
 * @UniqueEntity(fields={"name", "user"})
 */
class Tag implements TenantableEntityInterface
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=31)
     * @Assert\NotBlank
     * @Assert\MaxLength(limit="31")
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="tags")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

}

编辑:使用上面的定义验证表格但我得到了:

  

SQLSTATE [23000]:完整性约束违规:1062重复条目   密钥'UNIQ_389B7835E237E06A76ED395'的'name-1'。

使用相同的name和相同的用户创建两个标记。

2 个答案:

答案 0 :(得分:3)

如果您希望nameuser的组合都是唯一的,请使用:

@UniqueEntity(fields={"name", "user"})

如果您希望它们分别是唯一的,请使用:

@UniqueEntity(fields="name")
@UniqueEntity(fields="user")

同样适用于表格上的唯一约束。

答案 1 :(得分:1)

请注意:

对于yaml使用:

constraints:
    - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
        fields: username
        groups: [SomeYourGroup]

或者注释: 使用Symfony \ Bridge \ Doctrine \ Validator \ Constraints \ UniqueEntity;

  • @UniqueEntity(fields = {“username”},groups = {“SomeYourGroup”})

在文档http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

群组不可用!!!