Jak vykonat pomocí třídy Database nativní funkci MySQL (jako např. NOW())?

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

Zdravím všechny,

mám asi stupidní dotaz, ale zaboha nechápu, jak udělat toto, aniž bych musel použít „exec“ či „query“. Jde to vůbec?

articles->find($id)->update(array(
	"changedDate" => "NOW()",
));

V dokumentaci k ORM jsem našel např ⇒ new NotORM_Literal(„NOW()“), ale tady mi to nefunguje, samozřejmě.

Jak na to, poradíte?
Velmi děkuji za nakopnutí!

Používám k DB přístupu model, dle příkladů ze Sandboxu:

$this->articles = $this->getService('model')->getArticles();

Editoval Pudlík (29. 7. 2011 1:32)

Pudlík
Člen | 8
+
0
-

Pokusím se odpovědět :-)

Mám použít z „Nette\Database\Table“ funkci „execute()“ a do ní dát NOW()?

articles->find($id)->update(array(
        "changedDate" => execute('NOW()'),
));

Takto to nefunguje. Zatím do ORM pouze pronikám, tak bych potřeboval nakopnout, a pak dám pokoj :-)

rixi
Člen | 109
+
+1
-

Ahoj, ja to riesim takto:

articles->find($id)->update(array(
        "changedDate" => new DateTime, // new DateTime53 v PHP5.2
));
h4kuna
Backer | 740
+
0
-

rixi napsal(a):

Ahoj, ja to riesim takto:

articles->find($id)->update(array(
        "changedDate" => new DateTime, // new DateTime53 v PHP5.2
));

Toto řešení má skrytou chybku. Pokud budeš mít dva stroje apache/databaze tak můžou mít rozdílný čas (cca minuty) a stalo se že člověk vložil příspěvek a pak to psalo: příspěvek byl vložen ‚za okamžik‘.

Já využívám převážně datumů z databáze a ty pak předávám DateTime() jako parametr, proto bych se klonil k verzi s NOW().

Filip Procházka
Moderator | 4668
+
0
-

Co ti to pomůže, pokud je čas posunutý i v databázi?

OK3
Člen | 91
+
0
-

Nějaké obecné řešení jak místo php kódu zavolat funkci DBMS neexistuje? Já k těmto účelům používám v dibi modifikátor:

<?php
$res = $model->update($id, array('changedDate%sql' => 'NOW()'));
?>

S Database zkušenost nemam.

Filip Procházka
Moderator | 4668
+
+1
-

A tohle znáte?

$this->getService('model')->getArticles()->find($id)->update(array(
        "changedDate" => new Nette\Database\SqlLiteral('NOW()'),
));

Nevím jestli to bude fungovat, ale příště zkuste třeba prostudovat API, když vám bude na něco chybět dokumentace…

h4kuna
Backer | 740
+
0
-

HosipLan napsal(a):

Co ti to pomůže, pokud je čas posunutý i v databázi?

Právě že nepomůže, ale může to dělat neplechu.

Pudlík
Člen | 8
+
0
-

HosipLan napsal(a):

A tohle znáte?

$this->getService('model')->getArticles()->find($id)->update(array(
        "changedDate" => new Nette\Database\SqlLiteral('NOW()'),
));

To je přesně to, co jsem hledal – něco ve smyslu SQLLiteral. Hned pozkouším, moc děkuji!