tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

insertId

před 11 lety

PetrP
Člen | 587
+
0
-

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 | 6790
+
0
-

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
+
0
-

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 | 6790
+
0
-

Ok, nyní se to ovládá přes $primaryAutoIncrement = FALSE;