两列的唯一实体 - Symfony2

时间:2014-04-01 12:16:45

标签: php symfony doctrine-orm

我有餐厅和类别 - 每个类别都有一个餐厅,每个餐厅可以有很多类别。我希望每个餐馆的类别都有唯一的名称,如果有人试图打破这个,我想要获得表单无效的消息,不要被架构停止。所以这就是我的尝试:

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"}),但是我收到一条错误,即没有通过Doctrine映射restaurant_id。

任何想法为什么它不起作用:(

4 个答案:

答案 0 :(得分:0)

我认为您的问题是您的表中已有数据不符合您的新约束。尝试截断表并再次更新,或在更新架构之前手动编辑数据以反映新约束。

答案 1 :(得分:0)

您可以在两个字段中添加 @UniqueEntity()中的 fileds 。像..

    @UniqueEntity(fields={"name", "restaurant"}).

并且,我希望您的解决方案在https://github.com/symfony/symfony/issues/6727

答案 2 :(得分:0)

在我自己的UniqueEntity中,我有一个客户字段和一个必须组合的选项字段。客户是由对控制器的请求设置的,而不是由表单本身设置的,因此断言不起作用。通过使表单呈现客户,然后在呈现的表单视图中隐藏该选项,我能够解决问题。

答案 3 :(得分:0)

要做到这一点,您必须有一个空表。