Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Удаление ассоциации с использованием идентификатора связанной сущности в Doctrine 2

Автор вопроса: gremoОтветов: 3

Документация Doctrine 2 гласит, что:

Удаление ассоциации между двумя объектами также просто. Для этого есть две стратегии: по ключу и по элементу.

Что значит "по ключу"? Это поле id связанного объекта или просто позиция связанного объекта в коллекции? Например, здесь используется $ithComment (это позиция комментария):

// Remove by Key
$user->getComments()->remove($ithComment);
$comment->setAuthor(null);

phpsymfonydoctrinedoctrine-orm

Ответы

Ответ 1 · рейтинг 1 · Lee Davis

Это позиция связанного объекта в коллекции. При проверке ArrayCollection..

public function add($value)
{
    $this->_elements[] = $value;
    return true;
}

public function remove($key)
{
    if (isset($this->_elements[$key])) {
        $removed = $this->_elements[$key];
        unset($this->_elements[$key]);

        return $removed;
    }

    return null;
}

Вы можете видеть, что ссылка на идентификатор элементов коллекции не используется.

Ответ 2 · Guillaume Flandre

Согласно Doctrine2 API, метод удаления коллекции Doctrine,

"Удаляет элемент по указанному индексу из коллекции"

(см. https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Collections/Collection.php#L78)

Мой вывод состоит в том, что ключ, о котором вы говорите, действительно является позицией связанного объекта.

Ответ 3 · sebob

У меня есть решение, может быть, это хорошо для вас:

public function addSectors(ArrayCollection $sectors)
{
    foreach($sectors as $k => $sector) {
        $this->addSector($sector);
    }
}

public function removeSectors($sectors)
{
    foreach($sectors as $k => $sector) {
        unset($this->sectors[$k]);
    }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы