Уникальные данные в отношениях «многие ко многим» - PullRequest
0 голосов
/ 16 марта 2012

Я использую Doctrine2 в качестве ORM в проекте Symfony2. У меня есть article и tag классы сущностей. Между ними много-много-много отношений. Статья может иметь много тегов и наоборот. Существует объединенная таблица, article_tags, которая имеет только 2 столбца article_id и tag_id и сгенерирована доктриной. Все работает нормально, за исключением того, что при добавлении новой статьи с некоторыми тегами новые и уже существующие теги вставляются в таблицу 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 () должен быть экземпляром Сеферов \ ArticleBundle \ Entity \ Tag, дано ноль, вызывается в /var/www/seferov.local/src/Seferov/ArticleBundle/Repository/TagRepository.php в строке 34 и определяется в /var/www/seferov.local/src/Seferov/ArticleBundle/Entity/Article.php линия 393

1 Ответ

0 голосов
/ 16 марта 2012

Вам необходимо проверить, существует ли тег.Если это так, то используйте его.Если нет, то создайте его.

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;
}

Обязательно сделайте столбец тега уникальным и перехватывайте исключения.Возможно, что другой запрос может вставить тот же тег между находкой и сохранением.

...