Kdyby\Doctrine a softdeletable, jak na to?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
0
-

Ahoj, chtel bych vyuzivat softdeletable ve spolupraci s Kdyby\Doctrine (zatim jsem experimentoval pouze s rixxi\gedmo, ale neuspesne).

Nemate nekdo zkusenosti s implementaci a funkcni reseni?

Takto vypada moje konfigurace gedma a doctrine:

gedmo:
	translatableLocale: cs_CZ
	defaultLocale: cs_CZ
	all: on

doctrine:
	user: root
	password:
	dbname: testdb
	metadata:
		App: %appDir%/../libs/Model/Entities
	types:
		bit: Doctrine\DBAL\Types\BooleanType
	filters:
		softDeleteable: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter

Navic softDeletable filter zapinam v basepresenteru ve starutpu:

	protected function startup()
	{
		parent::startup();

		$this->entityManager->getFilters()->enable("softDeleteable");
	}

Zapnuti filtru v presenteru jsem zkousel z toho duvodu, ze $em->getFilters()->enabledFilters vracelo prazdne pole, z toho jsem usoudil, ze filtr asi neni aktivni?

No, mazani probiha zhruba takto:

		$dao = $this->entityManager->getDao(Entities\InvoicingData::class);
		$entity = $dao->find($id);

		if ($entity) {
			$dao->delete($entity);
		}

Ocekavane chovani by bylo, ze se mi nastavi proerty $deletedAt na new \DateTime, jenze zaznam se smaze uplne, take bych ocekaval, ze kdyz zavolam $repository->findAll() tak mi to nevrati zaznamy, kterym jsem rucne nastavil $deletedAt, i toto se nedeje (to bych dokazal prekousnout :)).

Budu rad za jakekoliv nakopnuti spravnym smerem.

Editoval Lexi (24. 2. 2015 17:10)

Jan Mikeš
Člen | 771
+
0
-

@F.Vesely: Diky za tip, kazdopadne dival jsem se na implementaci a testy, jenze zde se entity mazou pomoci

$entity->setDeletedAt((new \DateTime())->modify('+1 day'));

a mnohem vice se mi pozdava pouzit gedma, kde podle dokumentace staci zavolat metodu delete($entity) pres entity manager a entita se nesmaze ale nastavi se deletedAt. Jenze bohuzel se mi tohoto chovani nedari dosahnout.

Tomáš Votruba
Moderator | 1114
+
0
-

@Lexi Entitu smažeš klasicky pomocí EntityManager:

$em->remove($category);

Viz https://github.com/…ineBehaviors#… – koukni i na ten první příklad. Vypadá to, žes koukal jen na ten druhý.

Editoval Tomáš Votruba (24. 2. 2015 23:36)

Jan Mikeš
Člen | 771
+
0
-

@TomášVotruba mas pravdu – prehledl jsem. Diky vyzkousim, snad budu mit vice stesti.

Co se tyka samotnych extensions do doctrine, jak je na tom KnpLabs/DoctrineBehaviors, myslim ze to byl @FilipProcházka kdo velmi nadaval na gedmo :).

Editoval Lexi (24. 2. 2015 23:44)

Jan Mikeš
Člen | 771
+
0
-

Tak s Zenify/DoctrineBehaviors mi softDeleteable funguje, pri zavolani $em->remove() se skutecne nastavi $deletedAt, ale

$dao->findAll();

vraci vsechny zaznamy – tedy i ty smazane.
Budu muset vzdy psat

->findBy(["deletedAt" => NULL])

nebo se to da nejak obejit?

paranoiq
Člen | 392
+
0
-

používat přístup, kdy vám jména metod lžou o tom co skutečně dělají (delete() nic nesmaže, findAll() nevrací vše) se vám časem šeredně vymstí. klamete tím sebe i ty co budou na projektu dělat po vás a připravujete půdu pro budoucí bugy

Pavel Kravčík
Člen | 1196
+
+1
-

@paranoiq: FindAll() vrátí všechny záznamy a delete() maže záznam. To, že si chceš nechat otisk v databázi, nemá s tou logikou nic společného přece. Nestandardní to je v případě, jak píše Lexi. Jméno metody nelže, remove smaže záznam a ten se již nikde neobjevuje.

Pokud by neměl programátor přístup do DB – nepoznal by rozdíl. :)

Tomáš Votruba
Moderator | 1114
+
+1
-

@Lexi To je regulérní chování, jelikož Doctrine neví, jestli chceš zobrazit i „smazané“ záznamy (např. v adminu), či ne (front).

Na toto se používají filtry z Doctrine. V balíčku Zenify\DoctrineFilters mám příklad právě na softdeletable. Pak stačí přidat 1 třídu a můžeš si v ní nastavit, kdy záznamy ukazovat a kdy ne. Simple :)

Pokud filtry neznáš, těchto pár slidů vše vysvětluje.

Jan Mikeš
Člen | 771
+
0
-

@TomášVotruba o filtech jsem vedel, ale Zenify\DoctrineFilters znacne usnadnuje praci s nimi, diky ti moc za to!