2017-04-07 6 views
0

Quand jedoctrine clone ArrayCollection sans référence

$originalTags = $task->getTags(); 
$task->removeTag($tag1); 

alors $tag1 est également supprimé dans $originalTags. Donc, l'assignation de ArrayCollections est faite par référence, comment puis-je le cloner sur un nouveau ArrayCollection?

+0

http://php.net/manual/en/language.oop5.cloning.php – DrKey

+0

est $ tâche une entité de doctrine? – JackalopeZero

+1

@drkey cool, très facile, vous pouvez poster ceci comme réponse – Asara

Répondre

0

Vous pouvez simplement utiliser PHP natif clone pour object cloning.

$originalTags = $task->getTags(); 
$task2 = clone $task; 
$task2->removeTag($tag1); 
0

je pourrais avoir trouvé la solution moi-même, mais je ne sais pas si cela peut entraîner des problèmes parce que je pouvais perdre des données:

$originalTags = new ArrayCollection($task->getTags()->toArray()); 
0

Au lieu de gérer ce problème individuellement à chaque fois que vous avez besoin getTags (), renvoie un clone de getTags plutôt que la référence.

public function getTags(){ 
    return new ArrayCollection($this->tags->toArray()); 
} 

ou si vous avez besoin pour préserver la fonctionnalité de getTags passant par référence, créez une nouvelle getClonedTags de fonction ou de transmettre une variable à la fonction get qui en option retour des balises clonés.

public function getTags($cloned = false){ 
    if($cloned){ 
     return new ArrayCollection($this->tags->toArray()); 
    } 

    return clone $this->tags; 
}