Kdyby/Doctrine – update stavů více entit
- chap
- Člen | 81
Ahoj,
chtěl bych se zeptat na Váš názor. V aplikaci zobrazuji náhledy inzerátů, u kterých počítám počet zobrazení. Řeším to tak, že ve Facade si načtu dané entity (počet a parametry dle potřeby) a než tyto inzeráty předám k zobrazení tak přes foreach inkrementuji počet nějak takto:
public function findInzeraty($i = 4){
$res = $this->getQueryBuilder()->setMaxResults($i)->getQuery()->getResult();
foreach ($res as $r){
$r->zobrazeno++;
$this->em->persist($r);
}
$this->em->flush();
return $res;
}
Tahle funkce se pak v aplikaci volá dle potřeb (podle zobrazených
komponent) a má to za důsledek, že na jeden request mi to vygeneruje např
30 jednorázových update dotazů, což asi není nejlepší přístup. Chtěl
jsem se zeptat, zda doctrine nemá nějaké prostředky pro řešení podobných
situací nebo jak by jste to jinak řešili vy. Mě napadlo např udělat si
službu (nebo statickou vlastnost Facade?), kde bych si uchovával ID
zobrazených a někde na konci chod aplikace by se provedl dotaz kde by bylo
něco jako (UPDATE inzeraty SET pocet = pocet+1 WHERE id IN(…)). To by pak
ale možná mělo vlastnost, že pokud se daný inzerát na jedné stránce
zobrazil 2×, tak bych stejně přičetl jen 1×. To by zase mohlo vyřešit
např stejný dotaz na update, ale na konci zmíněné metody.
Ale důvod proč se ptám, je jestli třeba není nějaký jiný přístup
k podobné situaci, o kterém nevím :) Snad je to k pochopení. Předem
díky za reakce. Chap
- Filip Klimeš
- Nette Blogger | 156
Koukni na bulk updates. Mohl by sis pomocí DQL postavit dotaz, který by inkrementovat všechny záznamy splňující kritéria.
Editoval FilipKlimeš (30. 1. 2015 10:40)
- chap
- Člen | 81
Ahoj, tak nějak jsem to myslel, jen jsem si říkal, jestli není i nějaký jiný způsob :) Vyřešil jsem takto:
...
$updateQ = $this->em->createQuery("UPDATE ".Inzerat::getClassName()
." i SET i.zobrazeno= i.zobrazeno+1 WHERE i.id IN (?1)");
$res= $qb->getQuery()->getResult();
$ids = [];
foreach ($res as $r){
$ids[]=$r->id;
}
$updateQ->execute([1=>$ids]);
...