Kdyby/Doctrine – update stavů více entit

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

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
+
+2
-

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
+
0
-

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]);
...