mirror of
https://github.com/wallabag/wallabag.git
synced 2025-02-01 00:16:43 +01:00
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:
parent
39ba51ca1a
commit
3be047456d
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user