tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

problém s nastavením datového typu v selektu

před 10 lety

simon
Člen | 98

Ahoj, mám tento kód:

<?php
$select = $this->select("*");
$select->orderBy("a_created","DESC");
$select->setType('a_id', dibi::FIELD_INTEGER);
return $select->fetch();
?>

ale nefungujeto, dibi hlasi error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET TYPE a_id i LIMIT 1' at line 1

vysledny dotaz vypada takto

SELECT *
FROM `view_articles`
ORDER BY a_created DESC
SET TYPE a_id i
LIMIT 1

predem diky za radu.

před 10 lety

simon
Člen | 98

jinak s konstrukci set type id i sem se jeste nikdy nesetkal tak jsem to chtel jen vyzkouset. zivotne to asi nepotrebuju. ani na netu jsem nenasel reference na tento sql prikaz. pokud by nekdo vedel link tak budu rad

před 10 lety

onge
Člen | 53

Kdyz ten dotaz pustis primo na MySQL, tak probehne spravne?

Popravde konstrukci SET TYPE jsem v zivote nevidel, tak me napada, jestli to MySQL vubec umi.

před 10 lety

LM
Člen | 206

Neřekl bych že SET TYPE v mysql existuje, ale existuje metoda DibiResult::setType() pomocí níž se dá přetypovat sloupec na typ v php.

$result = $this->select("*")
    ->orderBy("a_created","DESC")
    ->execute();
$result->setType('a_id', dibi::FIELD_INTEGER); // hodnota a_id bude typu integer namísto string
return $result->fetch();

je to co si myslel?

před 10 lety

simon
Člen | 98

aha takze tam musim pridat execute():)

před 10 lety

simon
Člen | 98

aha tak ted nevim. kdyzz to zapisu takhle:

<?php
$result = $this->select("*");
$result->orderBy("a_created","DESC");
$result->execute();
$result->setType('a_id', dibi::FIELD_INTEGER); // hodnota a_id bude typu integer namísto string
return $result->fetch();
?>

tak to nefunguje

kdyz takhle tak to jede.

<?php
$result = $this->select("*")
        ->orderBy("a_created","DESC")
        ->execute();
$result->setType('a_id', dibi::FIELD_INTEGER); // hodnota a_id bude typu integer namísto string
return $result->fetch()
?>

jaky je v tom rozdil?

před 10 lety

simon
Člen | 98

jeste jsem se na foru docet ze se to da nastavit globalne:

<?php

protected $types = array(
        'a_id' => array('type' => dibi::FIELD_INTEGER, null),
    );

?>

ale to mi uz vubec nefunguje. takhle vypada ta trida:

<?php

class Articles extends DibiTable
{

    protected $name = 'view_articles';
    protected $types = array(
        'a_id' => array('type' => dibi::FIELD_INTEGER, null),
    );

    public function findArticles()
    {

        $select = $this->select("*");

        return $select->fetchAll();

    }
}
?>

predem diky za jakekoli rady.

před 10 lety

PetrP
Člen | 587

simon napsal(a):

aha tak ted nevim. kdyzz to zapisu takhle:

<?php
$result = $this->select("*");
$result->orderBy("a_created","DESC");
$result->execute();
$result->setType('a_id', dibi::FIELD_INTEGER); // hodnota a_id bude typu integer namísto string
return $result->fetch();
?>

tak to nefunguje

kdyz takhle tak to jede.

<?php
$result = $this->select("*")
        ->orderBy("a_created","DESC")
        ->execute();
$result->setType('a_id', dibi::FIELD_INTEGER); // hodnota a_id bude typu integer namísto string
return $result->fetch()
?>

jaky je v tom rozdil?

V prvním případě nastavím $result jako DibiFluent a když volám DibiFluent::setType() tak neexistuje.
V druhém případě je $result návratová hodnota metody DibiFluent::execute() což je DibiResult a DibiResult::setType() už existuje.

před 10 lety

simon
Člen | 98

dobra a ta trida s globalnim nastavenim typu je spravne?

před 10 lety

PetrP
Člen | 587

simon napsal(a):

dobra a ta trida s globalnim nastavenim typu je spravne?

Těško říct, doufal jsem že odpoví někdo kdo s tím má skušenost. ;]

Jinak toto není správně:

'a_id' => array('type' => dibi::FIELD_INTEGER, null),

// má být
'a_id' => array('type' => dibi::FIELD_INTEGER, 'format' => null),
// nebo raději
'a_id' => array('type' => dibi::FIELD_INTEGER),

// udivuje mě že nefunguje toto, protože se format používá akorát u datumu
// taky by to tak odpovídalo podle dokumentace: `array of pairs [type, format]`
'a_id' => dibi::FIELD_INTEGER,

Ale fungovat by mělo i to tvoje.

Aha už to chápu. $types se použije v metode DibiTableX::complete která se volá jen v DibiTable::fetch, DibiTable::findAll atd., ale ty tam voláš DibiTable::select() které vrací DibiFluet a to $types nepoužije.

Zkus to takto

$select = $this->select("*");
$select->setType('a_id', dibi::FIELD_INTEGER);
//nebo
$select->setTypes($this->types);
// oboje volat metody na DibiResult
return $select->fetchAll();

Editoval PetrP (24. 2. 2009 17:14)

před 10 lety

simon
Člen | 98

super diky! uz to chapu.