多对多关系中的独特数据

时间:2012-03-16 09:18:21

标签: php symfony many-to-many doctrine-orm relational-database

我在Symfony2项目中使用Doctrine2作为ORM。我有articletag个实体类。他们之间有多对多的关系。一篇文章可能有很多标签,反之亦然。有一个联接表article_tags,它只有2列article_idtag_id,并由doctrine生成。一切正常,但是,当添加带有某些标签的新文章时,新的和预先存在的标签都会插入到tag表中,其中我只想存储唯一标记; article_tags应该只关联它们。

我的文章架构:

  manyToMany:
    tags:
      targetEntity: Tag
      cascade: ["persist"]
      joinTable:
    name: article_tag
    joinColumns:
      article_id:
        referencedColumnName: id
    inverseJoinColumns:
      tag_id:
        referencedColumnName: id

tag添加唯一属性并忽略重复项是不合理的,因为应该存在关系。我尝试添加逻辑,检查标记是否存在获取标记数据并将其添加到文章:

$article->addTag($existingTag);

它出现以下错误:

  

捕获致命错误:参数1传递给   Seferov \ ArticleBundle \ Entity \ Article :: addTag()必须是。的实例   Seferov \ ArticleBundle \ Entity \ Tag,null给定,调用   /var/www/seferov.local/src/Seferov/ArticleBundle/Repository/TagRepository.php   在第34行并在中定义   /var/www/seferov.local/src/Seferov/ArticleBundle/Entity/Article.php   第393行

1 个答案:

答案 0 :(得分:0)

您基本上需要检查标签是否存在。如果确实如此,那就使用它。如果没有,那么创建一个。

public function loadOrg($orgId,$autoCreate = false)
{
    $org = $this->getEntityManager()->find('ZaysoCoreBundle:Org',$orgId);
    if ($org) return $org;

    if (!$autoCreate) return null;
    if (!$orgId)      return null;

    $org = new Org();
    $org->setId($orgId);
    $this->getEntityManager()->persist($org);
    return $org;
}

确保您的标记列唯一并捕获异常。另一个请求可能在find和persist之间插入相同的标记。