Oznámení
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.