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

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

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

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

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

person gremo    schedule 12.06.2012    source источник


Ответы (3)


Это позиция связанного объекта в коллекции. При проверке 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;
}

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

person Lee Davis    schedule 12.06.2012

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

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

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

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

person Guillaume Flandre    schedule 12.06.2012

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

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]);
    }
}
person sebob    schedule 10.12.2013