Oznámení
insertId
před 11 lety
- PetrP
- Člen | 587
V případě že mám v db tabulku bez auto_increment a volám DibiTable::insert() tak návratová hodnota má být získaná z mysql_insert_id, to ale vrátí 0 (protože žádné id není) a v DibiConection.php(324) následující vyhodí výjimku.
$id = $this->driver->insertId($sequence);
if ($id < 1) throw new DibiException('Cannot retrieve last generated ID.');
To je výhodné v případě že auto_increment tabulka má. V mém případě ale nemůžu nic uložit bez vyhození výjimky.
Jinak dibi 0.9 rev 134 (v některých souborech se ještě píše rev 133 tak nevím)
před 11 lety
- David Grudl
- Nette Core | 6806
Mělo by to být vyřešeno v poslední verzi – nastav u DibiTable proměnnou $primary na FALSE (nebo NULL).
před 11 lety
- PetrP
- Člen | 587
Možná jen něco nechápu, ale podle mě to vyřešené není.
Když nastavím $primary na NULL tak se v $this->setup() pustí autodetekce. Doplní se id a v $this->insert() se $this->connection->insertId() spustí. Což je podle mě správně chování (ale neodpovídá tomu co píšeš nahoře)
Když nastavím $primary = ‚name‘, protože v mysql mám nastaveno jako primární klíč právě [name]. Tak vše funguje tak jak má až do chvíle kdy spustím insert, ta vola funkci mysql_insert_id která má vrátit poslední použitý AUTO_INCREMENT. Tabulka ale nic takového nemá a vrací 0, ty to odchytíš tímhle if ($id < 1) a končím na výjimce. To je špatně, a tvoje řešení to neřeší. Měl by existovat nějaký přepínač $insertReturnId, podle kterého můžu ovlivnit tohle vrácení. Popřípadě by to mohlo rozhodovat i podle toho jestli $primaryModifier nastavím na %s, protože string určitě nebude AUTO_INCREMENT.
Jestli nastavím jak píšeš $primary false tak se v setup nepustí autodetekce (protože $this->primary !== NULL) a tedy nemám žádný primární klíč a cele to skončí na prvnim sql dotazu něčím jako Unknown column '' in ‚where clause‘. To je podle mě nejlepší možnost ;]
Řešení bych vyděl
//DibiTable.php(143) insert()
if ($this->insertReturnId) {
return $this->connection->insertId();
}
//DibiTable.php(127) setup()
if ($this->insertReturnId === NULL) {
$this->insertReturnId = ($this->primaryModifier=='%i');
}
Tedy stavím to na tom že v mysql jde mít PRIMARY bez AUTO_INCREMENT, netetuším jak to je v ostatních pokoutných databázích.
před 11 lety
- David Grudl
- Nette Core | 6806
Ok, nyní se to ovládá přes
$primaryAutoIncrement = FALSE
;