The classes
In a forum, there are Authors. These authors can post messages. Every Message has one and only one Author, and an Author can write many Messages : this is typically a OneToMany relationship.Here are the equivalent classes :
/** * @ORM\Entity * @ORM\Table(name="Author") * @ORM\Entity(repositoryClass="Acme\DemoBundle\AuthorRepository") */ class Author { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") * @var int */ protected $id; /** * @ORM\OneToMany(targetEntity="Message", mappedBy="author", cascade={"persist", "remove"}) */ protected $messages; /** * Add message * * @param Acme\DemoBundle\Entity\Message $message */ public function addMessage(Acme\DemoBundle\Entity\Message $message) { $this->mesages[] = $message; $message->setAuthor($this); return $this; } /** * Get messages * * @return Doctrine\Common\Collections\Collection */ public function getMessages() { return $this->messages; } public function __construct() { $this->messages = new \Doctrine\Common\Collections\ArrayCollection(); } } /** * @ORM\Entity * @ORM\Table(name="Message") * @ORM\Entity(repositoryClass="Acme\DemoBundle\Repository\MessageRepository") */ class Message { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") * @var int */ protected $id; /** * @ORM\ManyToOne(targetEntity="Author", inversedBy="messages", cascade={"persist", "update"}) * @ORM\JoinColumn(name="author_id", referencedColumnName="id", onDelete="cascade", onUpdate="cascade") * @var Acme\DemoBundle\Entity\Author */ protected $author; }
The issue
Now, let's say you want to transfer messages from author 2 to author 1 for some reason. Here is how to do it step by step :
// Get the entities $Author1 = $authorRepository->find($idAuthor1); $Author2 = $authorRepository->find($idAuthor2); // Retrieve messages $messagesOfAuthor2 = $Author2->getMessages();Here is a visual description of what has happened : We transfer each of the messages :
// Move message foreach($messagesOfAuthor2 as $message) { $Author1->addMessage($message); // Leads to state 1 $Author2->getMessages()->removeElement($message); // Leads to state 2 }
Note the deletion of 1 link in the removeElement function, and the addition of 2 links in the addMessage function.
We can now remove the Author 2 and flush the EntityManager :
$entityManager->remove($Author2); $entityManager->flush();
Aucun commentaire:
Enregistrer un commentaire