我有餐厅和类别-每个类别有一个餐厅,每个餐厅可以有许多类别。我希望每个餐厅的类别有唯一的名称,我希望如果有人试图打破这一点,得到的消息是,形式是无效的,而不是被阻止的模式。所以这里是我的尝试:
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Table(name="categories", uniqueConstraints={@ORM\UniqueConstraint(name="name_restaurant_id_idx", columns={"name", "restaurant_id"})}))
* @ORM\Entity(repositoryClass="MyBundle\Entity\CategoryRepository")
* @UniqueEntity({"name", "restaurant"})
*/
class Category
{
/** @ORM\Column(name="category_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $categoryId;
/**
* @ORM\Column(name="name", type="string", length=45, nullable=false, unique=true)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="MyBundle\Entity\Restaurant")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="restaurant_id", referencedColumnName="restaurant_id", unique=true)
* })
*/
private $restaurant;
但它不起作用:(我被模式阻止,SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
我还尝试了* @UniqueEntity({"name", "restaurant_id"})
,但是我得到一个错误,restaurant_id没有被DoctrineMap。
你知道为什么它不工作吗:(
4条答案
按热度按时间piv4azn71#
要在多个字段上创建唯一约束,必须将它们添加到**@UniqueEntity()中的fields**参数。
例如:
我也希望这个问题已经得到解决https://github.com/symfony/symfony/issues/6727
ycl3bljg2#
我认为您的问题是表中已有不符合新约束的数据。请尝试截断表并再次更新,或在更新架构之前手动编辑数据以反映新约束。
dpiehjr43#
在我自己的UniqueEntity中,我有一个customer字段和一个option字段,它们必须是唯一的组合。customer是由对控制器的请求设置的,而不是由表单本身设置的,所以Assert不起作用。我可以通过让表单呈现customer,然后在呈现的表单视图中隐藏该选项来解决这个问题。
u59ebvdq4#
为此,您必须有一个void表。