tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Jak vynutit datový typ TIME

před 6 lety

CZechBoY
Člen | 3258

Zdravim,
chtěl bych se zeptat jak vynutit datový typ TIME jednomu sloupci.
Používám Dibi Fluent a když zavolám funkci setType tak mi to hodí chybu se špatným SQL dotazem. :-(
Když si to sám přetypuju přes strtotime tak mi to vyhodí error, že DibiDateTime nemá property date – musim použít nějaký dump, který tam tu property dostane… wtf?

před 6 lety

Milo
Nette Core | 1119

Vynutit kdy? Dáš sem příklad s tím SQL dotazem?

před 6 lety

CZechBoY
Člen | 3258

jasně

$result = $conn->select('start')->from('reservations')->where('id = %i', $id);

dibi naformátuje start jako DateTime, přičemž v databázi je pouze čas → datum je dnešní (bohužel špatné)

před 6 lety

Milo
Nette Core | 1119

Aby's nedostal SQL error, musíš ten dotaz před setType() nejprve spustit pomocí execute(). Jinak se to bere jako pokračování SQL dotazu.

$result = $conn->select('start')->from('reservations')->where('id = %i', $id)->execute()->setType('start', dibi::TIME);

No, ale Tobě to přetypování vůbec nepomůže, protože Dibi ukládá čas stejně jako datum v DateTime objektu. V PHP totiž na samostatný čas třída není. Můžeš ale při výpisu hodnotu snadno přeformátovat: $row->start->format('H:i:s').

Editoval Milo (5. 3. 2013 11:03)

před 6 lety

CZechBoY
Člen | 3258

jojo to jsem taky zkoušel, asi dělám něco špatně, protože mi to hláší, že nezná start

$result = $conn->select('start')->from('terms')->where('id_reservation = %i', $id);
$result->execute();
//$rows = $result->fetchAll();
$terms = array();
foreach($result->fetch() as $r) {
    $terms[] = $r->start->format('H:i');
}

jo už mi to funguje, když dám pryč ten start :-)

$result = $conn->select('start')->from('terms')->where('id_reservation = %i', $id);
        $result->execute();
        $terms = array();
        foreach($result->fetch() as $r) {
            $terms[] = $r->format('H:i');
        }

díky

Editoval CZechBoY (5. 3. 2013 11:24)

před 6 lety

Milo
Nette Core | 1119
$result->fetch === jeden řádek

foreach ($result as $row) {
    $row->start->format(...);
}

před 6 lety

CZechBoY
Člen | 3258

a jak teda projedu všechny řádky?
musim dát $result->fetchAll() a potom přes foreach($result as $row) ?

před 6 lety

Milo
Nette Core | 1119

Můžeš tak i tak, $result je iterátor.

$rows = $db->select(...)->from(...)->fetchAll(); // vytáhne všechny řádky do pole = zabere paměť
foreach ($rows as $row) {
}

$result = $db->select(...)->from(...)->execute(); // dotaz se jen spustí
foreach ($result as $row) { // tahá se řádek po řádku = paměťová úspora
}

Druhý způsob je dobrý návyk. Ale jestli taháš 10 řádků tak je to fuk.

Editoval Milo (5. 3. 2013 11:56)

před 6 lety

CZechBoY
Člen | 3258

ok dík
jsem dal pryč ten execute a pohroma byla na světě :D