Vypsání datumu a času z dabáze

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

Chtěl bych se zeptat, jak vytáhnu dateTime z dabatabáze. (resp z tohodle pole)

Nette\Database\Row(1) {
   datum => Nette\DateTime(3) {
      date => "2013-05-03 00:20:09" (19)
      timezone_type => 3
      timezone => "Europe/Prague" (13)
   }

zkoušel jsem to takhle, ale to nefunguje…jediný co mě napadá je to oříznout nějakym regulárním výrazem, ale nevim, jestli má cenu se s nim dělat, když to musí jít lehce…

$dotaz = $this->connection->query($dotazSelect)->fetch();
	$dotaz = $dotaz[date];
Glottis
Člen | 129
+
0
-

asi nerozumim poradne dotazu, jak vytahnu? tohle nefunguje?

dump($dotaz[date]->format("Y-m-d h:i:s"));
wasek2611
Člen | 17
+
0
-

Laděnka mi nahlásí chybu:

Use of undefined constant date – assumed ‚date‘

celej kód metody :

	$dh = $this->connection;
	$dotazSelect= "SELECT MIN(datumOdehrani) AS datum FROM zapas WHERE idSezony=$idSezony ";

	$dotaz = $this->connection->query($dotazSelect)->fetchAll();
	$dotaz = $dotaz[date]->format("Y-m-d h:i:s");
	Debugger::dump($dotaz);

Editoval wasek2611 (6. 5. 2013 23:37)

hrach
Člen | 1838
+
0
-

nauc se php.

$dotaz = $dotaz['date']->format("Y-m-d h:i:s");
wasek2611
Člen | 17
+
0
-

to jsem samozřejmě taky zkoušel, dát to do do uvozovek…ale pak:

Undefined index: date

hrach
Člen | 1838
+
0
-

a cti manual

$dotaz = $this->connection->query($dotazSelect)->fetch();
Glottis
Člen | 129
+
0
-

protoze tam mas fetchAll a to vraci pole objektu. dumpni si to ;)

wasek2611 napsal(a):

to jsem samozřejmě taky zkoušel, dát to do do uvozovek…ale pak:

Undefined index: date

wasek2611
Člen | 17
+
0
-

To jsem taky zkoušel :D (místo fetchAll fetch), pak mi to napíše

Undefined property: Nette\Database\Row::$date

když přidám properu

private $date; tak mi to napíše

syntax error, unexpected T_PRIVATE (když to uvedu v metodě, když to uvedu před konstruktorem, tak mi to napíše opět tu první hlášku)

a když tam nenapíšu fetch ani fetchAll, tak mi to napíše
Cannot use object of type Nette\Database\Statement as array

*************************VYŘEŠENO

už jsem to vyřešil..kdyby něhoko zajímalo:

$dotaz = $this->connection->query($dotazSelect)->fetchColumn(0);

Editoval wasek2611 (7. 5. 2013 0:05)

Petr Hudík
Člen | 49
+
0
-

Předpokládám, že to souvisí s tím, že v dotazu máš sloupec, který se jmenuje datum, nikoliv date, proto je zcela logické, že to sloupec s názvem date nenašlo a proto ta chybová zpráva.

Proč vlastně používáš metodu query? Daleko víc cool by bylo použít \Nette\Database\Table\Selection. Poté by dotaz mohl vypadat přibližně takto:

$dotaz = $this->connection->table('zapas')
	->select('MIN(datumOdehrani) AS datum')
	->where('idSezony', $idSezony)SELECT MIN(datumOdehrani)
wasek2611
Člen | 17
+
0
-

tenhle přístup pro query do db se mi ještě nedostal pod kůži :), ale věřím, že pro tyhle primitivní dotazy je lepší. Jsem trochu out v tomhle a radši používám SQL dotazy (prozatím). I když vím, že je to zbytečné psaní apod..

Ale dík za tim, každý takovýhle postřeh, přesně pro potřeby mého dotazu mi pomůže to lépe pochopit. (ono to docela pochopitelný docela je, jen plavu v tom, v jakém pořadí se to má volat). Takto dělané query mám jen tam, kde mám getry stejný, nebo velmi podobné jako v quickstartu.

Jak bys třeba v tom objektovém přístupu k relační db udělal tento dotaz?

$dotazSelect = "SELECT COUNT(*) FROM zapas WHERE idSezony=$idSezony AND stav=2 AND (idDomaci=$idHrace OR idHoste=$idHrace)";

Editoval wasek2611 (7. 5. 2013 0:24)

Petr Hudík
Člen | 49
+
0
-

Domnívám se, že rozdíl není ve zbytečném psaní, ale ve spoustě skvělých funkcí navíc. Osobně tento kód považuji za daleko přehlednější. Mohlo by to vypadat přibližně takto:

$countMatches = $this->connection->table('zapas')
	->where('idSezony', $idSezony)
	->where('stav = 2')
	->where('idDomaci = ? OR idHoste = ?', $idHrace, $idHrace)
	->count('*');

Při vytváření schématu je dobré dodržovat určité konvence. Psát názvy v angličtině bývá dobrým zvykem, dále se doporučuje pro oddělování slov nepoužívat velké písmeno (camelCase), ale podtržítko například ‚moje_tabulka‘ apod.

Na základě Tvého příkladu předpokládám, že máš tabulky zapasy, sezony, hraci. Velice užitečné je vytvářet mezi nimi spojení, to už je ale zcela jiné téma, přesto doporučuji důkladně prostudovat Dokumentaci – práce s tabulkami.

wasek2611
Člen | 17
+
0
-

Na úrovni db je mám propojené fk…(jen jsem ještě nepřišel na to, jak udělat složený primární klíč, v admineru se mi to nevede udělat…). Musim uznat, že ten tvuj kod vypadá lépe, mám se ještě co učit :).

buffus
Člen | 101
+
0
-

wasek2611 napsal(a):

…jak udělat složený primární klíč, v admineru se mi to nevede udělat…

Adminer na složený primární klíč asi nějaké přímé klikátko nemá, ale lze ho vytvořit snadno SQL příkazem obecně takto:

ALTER TABLE players_teams ADD PRIMARY KEY (id_players, id_teams);
Myiyk
Člen | 321
+
0
-

V admineru jde dělat složené klíče, klikátko na to je.
Zadá se typ indexu, a potom se v části sloupec zadají všechny sloupce na které platí tento index.