Kdyby\Doctrine a softdeletable, jak na to?
- Jan Mikeš
- Člen | 771
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
@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
@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)
- Pavel Kravčík
- Člen | 1196
@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
@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.