Symfony 2:多个关系和唯一对象

Symfony 2:多个关系和唯一对象,symfony,doctrine,doctrine-orm,Symfony,Doctrine,Doctrine Orm,我正在学习SF2——对所做的工作印象深刻,面对我自己无法解决的第一个真正问题 我有两个实体:Post和Tag。缩短代码如下: class Tag { /** * @ORM\ManyToMany(targetEntity="Post", mappedBy="tags", cascade={"persist"}) */ private $posts; public function __construct() { $this-&g

我正在学习SF2——对所做的工作印象深刻,面对我自己无法解决的第一个真正问题

我有两个实体:Post和Tag。缩短代码如下:

class Tag
{
    /**
     * @ORM\ManyToMany(targetEntity="Post", mappedBy="tags", cascade={"persist"})
     */
    private $posts;

    public function __construct()
    {
        $this->posts = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @param \My\AppBundle\Entity\Snippet $posts
     * @return Tag
     */
    public function addSnippet(\My\AppBundle\Entity\Post $posts)
    {
        $this->posts[] = $posts;

        return $this;
    }

    /**
     * @param \My\AppBundle\Entity\Snippet $snippets
     */
    public function removeSnippet(\My\AppBundle\Entity\Post $posts)
    {
        $this->posts->removeElement($posts);
    }

    /**
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getSnippets()
    {
        return $this->posts;
    }
}

如你们所见,我有两个实体之间的M:M关系

我还有一个表单可以添加带有嵌入式标记集合的帖子:

        $builder
            ->add('title')
            ->add('tags', 'collection', array(
                'type' => new \My\AppBundle\Form\TagType(),
                'allow_add' => true,
                'by_reference' => false,
                'prototype' => true
            ))
        ;
标记类型窗体类:

$builder->add('name');
一切正常。除了一件事:如果有一个具有以下名称的标记对象,我得到的是
SQLSTATE[23000]:完整性约束冲突
MySQL错误,这是显而易见的。若我应用了唯一的验证约束,我可以向post添加一个标记(若它已经存在于数据库中)

很明显,我需要检查数据库中是否存在以下标记,只有在不存在时才添加它,但是。。。怎么做呢

任何建议,谢谢

您可以使用来处理此问题。我看不到您的tags类上的注释,也看不到您的'name'声明,但是如果您添加了类似于下面的内容,它应该会给您一个基于name的唯一验证约束,并返回一条可选消息

/**
 * @ORM\Entity
 * @UniqueEntity(fields="name", message="This tag name already exists")
 */
class Tag...

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255, unique=true)
 */
protected $name;
您可以使用来处理此问题。我看不到您的tags类上的注释,也看不到您的'name'声明,但是如果您添加了类似于下面的内容,它应该会给您一个基于name的唯一验证约束,并返回一条可选消息

/**
 * @ORM\Entity
 * @UniqueEntity(fields="name", message="This tag name already exists")
 */
class Tag...

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255, unique=true)
 */
protected $name;

回答潜在问题:不,不想使用任何现有捆绑包,需要在SO社区的帮助下自己学习。回答潜在问题:不,不想使用任何现有捆绑包,需要在SO社区的帮助下自己学习。