在我的Tag
实体中,我需要避免在给定用户创建的所有标记中创建具有相同name
的标记。与User
实体存在多对一关系,名为user
。
我在数据库(使用uniqueConstraints
)和使用UniqueEntity
的表单验证中强制执行此约束。但我无法理解Symfony2 documentation中有关此约束的这句话:
此必填选项是字段(或字段列表) 实体应该是唯一的。例如,您可以指定两者 上述用户示例中的电子邮件和名称字段应该是唯一的。
但我需要name
和user
作为一个整体。这可能吗?怎么样?下面是一个不工作的例子:名称和用户都被检查为奇异字段的唯一性。
/**
* @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
和相同的用户创建两个标记。
答案 0 :(得分:3)
如果您希望name
和user
的组合都是唯一的,请使用:
@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;
在文档http://symfony.com/doc/current/reference/constraints/UniqueEntity.html
中群组不可用!!!