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

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

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

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

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

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


Ответы (3)


arrow_upward
1
arrow_downward

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

arrow_upward
0
arrow_downward

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

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

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

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

person Guillaume Flandre    schedule 12.06.2012

arrow_upward
0
arrow_downward

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

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