Change ManyToMany between entry & tag

Following https://gist.github.com/Ocramius/3121916

Be sure to remove the related entity when removing an entity.

Let say you have Entry -> EntryTag -> Tag.
If you remove the entry:

 - before that commit, the EntryTag will stay (at least using SQLite).
 - with that commit, the related entity is removed
This commit is contained in:
Jeremy Benoist 2016-05-30 14:34:11 +02:00 committed by Thomas Citharel
parent 6334f2cac1
commit e42b13bcff
4 changed files with 68 additions and 7 deletions

View File

@ -6,7 +6,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\Persistence\ObjectManager;
use Wallabag\CoreBundle\Entity\Config; use Wallabag\CoreBundle\Entity\Config;
use Wallabag\CoreBundle\Entity\TaggingRule;
class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
{ {

View File

@ -178,7 +178,15 @@ class Entry
/** /**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"}) * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"})
* @ORM\JoinTable * @ORM\JoinTable(
* name="entry_tag",
* joinColumns={
* @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
* }
* )
* *
* @Groups({"entries_for_user", "export_all"}) * @Groups({"entries_for_user", "export_all"})
*/ */
@ -526,13 +534,18 @@ class Entry
} }
} }
$this->tags[] = $tag; $this->tags->add($tag);
$tag->addEntry($this); $tag->addEntry($this);
} }
public function removeTag(Tag $tag) public function removeTag(Tag $tag)
{ {
if (!$this->tags->contains($tag)) {
return;
}
$this->tags->removeElement($tag); $this->tags->removeElement($tag);
$tag->removeEntry($this);
} }
/** /**

View File

@ -98,9 +98,30 @@ class Tag
return $this->slug; return $this->slug;
} }
/**
* @param Entry $entry
*/
public function addEntry(Entry $entry) public function addEntry(Entry $entry)
{ {
$this->entries[] = $entry; if ($this->entries->contains($entry)) {
return;
}
$this->entries->add($entry);
$entry->addTag($this);
}
/**
* @param Entry $entry
*/
public function removeEntry(Entry $entry)
{
if (!$this->entries->contains($entry)) {
return;
}
$this->entries->removeElement($entry);
$entry->removeTag($this);
} }
public function hasEntry($entry) public function hasEntry($entry)

View File

@ -163,7 +163,7 @@ class EntryControllerTest extends WallabagCoreTestCase
/** /**
* This test will require an internet connection. * This test will require an internet connection.
*/ */
public function testPostNewThatWillBeTaggued() public function testPostNewThatWillBeTagged()
{ {
$this->logInAs('admin'); $this->logInAs('admin');
$client = $this->getClient(); $client = $this->getClient();
@ -181,8 +181,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$client->submit($form, $data); $client->submit($form, $data);
$this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals(302, $client->getResponse()->getStatusCode());
$this->assertContains('/', $client->getResponse()->getTargetUrl());
$client->followRedirect();
$em = $client->getContainer() $em = $client->getContainer()
->get('doctrine.orm.entity_manager'); ->get('doctrine.orm.entity_manager');
@ -196,6 +195,35 @@ class EntryControllerTest extends WallabagCoreTestCase
$em->remove($entry); $em->remove($entry);
$em->flush(); $em->flush();
// and now re-submit it to test the cascade persistence for tags after entry removal
// related https://github.com/wallabag/wallabag/issues/2121
$crawler = $client->request('GET', '/new');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
$form = $crawler->filter('form[name=entry]')->form();
$data = [
'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
];
$client->submit($form, $data);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$this->assertContains('/', $client->getResponse()->getTargetUrl());
$entry = $em
->getRepository('WallabagCoreBundle:Entry')
->findOneByUrl($url);
$tags = $entry->getTags();
$this->assertCount(1, $tags);
$this->assertEquals('wallabag', $tags[0]->getLabel());
$em->remove($entry);
$em->flush();
} }
public function testArchive() public function testArchive()