Proc $database->getInsertId() nefunguje po $database->table($tblname)->insert($data)?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
chaky
Člen | 22
+
0
-

Pri debugovani sve aplikace jsem zjistil, ze mi metoda $database->getInsertId() vraci hodnotu 0.

$database->table(self::TABLE_NAME)->insert($data);
$id = $database->getInsertId(); // vrati 0

Pokud vsak pouziju metodu $database->query(), tak po INSERT obdrzim skutecne insertId.

$database->query("INSERT INTO " . self::TABLE_NAME . " ?", $data);
$id = $database->getInsertId(); // vrati skutecne insertId

Jaky je duvod takoveho chovani? Je snad ten prvni insert pres table() nejakym zpusobem zavrzenihodny?

h4kuna
Backer | 740
+
0
-

Ukaž jak máš založenou tabulku. V prvním případě by to mělo vracet ActiveRow pokud je v tabulce primární klíč.

chaky
Člen | 22
+
0
-

Tabulka ma primarni klic, ktery je zaroven auto_increment.

Aha, jasne – ActiveRow to samozrejme vraci, takze insertId muzu take ziskat pres $row[self::COLUMN_ID] … Nicmene porad mi prijde divne, proc se mi z getInsertId() vraci 0.

CREATE TABLE `outbox` (
  `UpdatedInDB` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `InsertIntoDB` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `SendingDateTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `SendBefore` time NOT NULL DEFAULT '23:59:59',
  `SendAfter` time NOT NULL DEFAULT '00:00:00',
  `Text` text,
  `DestinationNumber` varchar(20) NOT NULL DEFAULT '',
  `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL DEFAULT 'Default_No_Compression',
  `UDH` text,
  `Class` int(11) DEFAULT '-1',
  `TextDecoded` text NOT NULL,
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `MultiPart` enum('false','true') DEFAULT 'false',
  `RelativeValidity` int(11) DEFAULT '-1',
  `SenderID` varchar(255) DEFAULT NULL,
  `SendingTimeOut` timestamp NULL DEFAULT '0000-00-00 00:00:00',
  `DeliveryReport` enum('default','yes','no') DEFAULT 'default',
  `CreatorID` text NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `outbox_date` (`SendingDateTime`,`SendingTimeOut`),
  KEY `outbox_sender` (`SenderID`)
) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
h4kuna
Backer | 740
+
0
-

Je to tím, jak se po insertu zavolá znova statement pro select posledního záznamu tak se tato informace ztratí.

Jinými slovy pro NDT je následující konstrukce po insertu nepoužitelná.

$id = $database->getInsertId();

A mám takový pocit že jsem to snad ani nikdy nepotřeboval.

K id se dostaneš takto:

$row = $database->table(self::TABLE_NAME)->insert($data);
$row->id

Editoval h4kuna (23. 1. 2018 7:52)