Jak donutit Nette Database aby se znovu podíval do databáze

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

Zdravím, potřeboval bych donutit Nette database aby se znovu podívala do databáze. Tedy posloupnost operací je takováto:

  • natáhnu nějaký řádek (ActiveRow)
  • udělám (úplně od jinud) úpravu tohoto řádku.
  • znovu se zaptám na ten stejný řádek … zde nastane problém, vratí se mi totiž původní nezměněný řádek.

Věděl by někdo jak na to? Díky

ViPEr*CZ*
Člen | 817
+
0
-

Pošlete výpis kódu. Pokud si SELECTEM natáhnu řádek, pak provedu UPDATE a pak znova proběhne SELECT (všechny dotazy nejsou v transakci), pak znova zaSELECTOVaný řádek je furt ten původní?

joseff
Člen | 233
+
0
-
$row = $databse->table('content')->get(1);
$row->update(array('title', 'new title'));
dump($row->title);

Toto nevypise „new title“;
Proc?

ViPEr*CZ*
Člen | 817
+
0
-

No jestli se nepletu, tak pak to vypíše to samé jako před updatem… protože to pole je již naplněné a update dělá jen update a ne znovunačtení dat. Je tam potřeba si znovu zavolat select. I když v tudle chvíli je to zbytečné, když vím, že mi to vrátí title, kterej jsem před chvílí updatoval.

Filip Procházka
Moderator | 4668
+
0
-

Můžeš udělat tohle

$row = $databse->table('content')->get(1);
$row->title = 'new title';
$row->update();
dump($row->title);

Editoval HosipLan (17. 4. 2012 14:11)

joseff
Člen | 233
+
0
-

Zdravím, stále se mi nedaří donutit nette database aby se znovu podívalo do databáze. Nevítě někdo jak na to, prostě upravím nějaký řádek v DB a pak chci získat tan nový řádek s novými daty. Už si nevím rady jak této znalivě jednoduché akce dosáhnout.

Díky za rady

@HosipLan: To by asi fungovalo, ale co když chci updatovat 20 položek v jedné ActiveRow?

@ViPEr*CZ To je právě ten problém. Chtělo by aby ActiveRow měla metodu reload(), to by bylo super!
Nepřijde mi ideální po každém updatu volat

$contentRow = $this->connection->table('content')->get($contentRow->id)
ricco24
Člen | 141
+
0
-

Riešenia tu už boli nejaké navrhnuté. Skús sem postnúť kód s ktorým máš problém. Možno prídeme na riešenie „šité na mieru“.

duke
Člen | 650
+
0
-

joseff napsal(a):

@HosipLan: To by asi fungovalo, ale co když chci updatovat 20 položek v jedné ActiveRow?

A co ti brání nastavit 20 položek místo jedné, než provedeš update?

$row->foo1 = 'new foo1';
$row->foo2 = 'new foo2';
// ...
$row->foo20 = 'new foo20';
$row->update();
juzna.cz
Člen | 248
+
0
-

Co takhle?

$row = $databse->table('content')->get(1); // nactu
$row->update(array('title', 'new title')); // zmenim
$row = $databse->table('content')->get(1); // nactu aktualizovany data
dump($row->title);
pawouk
Člen | 172
+
0
-

@juzna.cz
To určitě fungovat bude, ale mě tam ten poslední řádek nějak nesedí, tan tam podle mého názoru prostě nepatří a je tam jen kvůli nedokonalosti funkce update (dle mého názrou) a je to nepotřebný dotaz do db. Já jsem s tím také chvíli bojoval stejně jako joseff, nakonec jsem si přepsal update a je to bez problému. Možná by stálo za to to takto zanést do nette:

Class ActiveRow{

public function update($data = NULL){
        if($data){
            foreach ($data as $name=>$value){
                $this->$name = $value;
            }
        }
        return parent::update();
    }

}
bojovyletoun
Člen | 667
+
0
-

Takouvouhle úpravu jsem si skutečně udělal jako experiment, ale nepoužívám ho. Možnost je samozřejmě upravit property a následně update(void), jak píše hosiplan. Ale je třeba taky počítat s tím, že hodnota nemusí být jen řetězec/číslo/datetime/blob…, ale může to být i SQL ('rand()', 'visits +1'), pak je nutné data znovu přečíst.

vvoody
Člen | 910
+
0
-

joseff napsal(a):

$row = $databse->table('content')->get(1);
$row->update(array('title', 'new title'));
dump($row->title);

Toto nevypise „new title“;
Proc?

pozrel si sa do db (phpmyadmin/adminer/…) ci tam ta zmena nastala?

Myslim ze ked to pole zapises spravne tak to pojde.

$row = $databse->table('content')->get(1);
$row->update(array('title'=>'new title')); // sipka namiesto ciarky
dump($row->title);