Nette database insert nevrací ActiveRow

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

Ahoj,

používám Nette 2.3.0 (released on 2015–02–25) a mám problém se zjištěním ID posledního vloženého řádku. Pro zjednodušení jsem skript redukoval na nutné minimum:

$row = $this->database->table(‚objednavky‘)->insert(array());

Dotaz se vykoná, řádek se v databází objeví, ale proměnná $row obsahuje místo ActiveRow jen hodnotu 1.

Poradíte mi někdo co dělám špatně ?

jvit
Člen | 2
+
0
-

je to napsané v komentáři té metody

<?php

	/**
	 * Inserts row in a table.
	 * @param  array|\Traversable|Selection array($column => $value)|\Traversable|Selection for INSERT ... SELECT
	 * @return IRow|int|bool Returns IRow or number of affected rows for Selection or table without primary key
	 */
	public function insert($data)
?>

nejspíš ta tvá tabulka nemá primární klíč

HonzaN
Člen | 66
+
0
-

@jvit : díky za reakci. Na tuhle vlastnost jsem narazil v jiném vkláknu. Nicméně tabulka PK má

CREATE TABLE objednavky (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
date datetime DEFAULT NULL,
test int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

vvoody
Člen | 910
+
0
-

To iste sa mi stalo nedávno, stačí zmazať cache. Je to asi nejaký bug. Ja som určite nemenil štruktúru a PK bol definovaný už pri vytvorení tabuľky a napriek tomu mi insert vracal number of affected rows dokiaľ som nepremazal cache.

HonzaN
Člen | 66
+
0
-

@vvoody Cache jsem mazal jako o život. Taky jsem restartnul databázi a nechal tabulku zkontrolovat/opravit. Nic. Problém se týká pouze té jedné tabulky. Nad jinou tabulkou v té samé databází dostávám ActiveRow.

HonzaN
Člen | 66
+
0
-

Ahoj,

znovu jsem narazil na ten samý problém:

$new = $this->db->table($params[‚table‘])->insert($values);
return $new->id;

vrátí prázdné $new a chybu Notice: Trying to get property of non-object

dotaz (z tracy)

INSERT INTO titul_top (titul_id, poradi)
VALUES (33694, ‚10‘)

se vykoná a záznam v db vznikne.

Struktura tabulky:

CREATE TABLE titul_top (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
titul_id int(4) unsigned zerofill DEFAULT NULL,
poradi int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

HonzaN
Člen | 66
+
0
-

Ještě doplním – tabulku jsem smazal, vytvořil ji znovu zkopírováním jiné kde se chyba nevyskytovala a upravil strukturu. Teď dostávám zpátky očekávaný Active Row.

Struktura „nové“ tabulky:

CREATE TABLE titul_top (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
titul_id int(4) unsigned zerofill DEFAULT NULL,
poradi int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Cache jsem mazal v obou případech.

HonzaN
Člen | 66
+
0
-

O mnoho tabulek dále…vždy pomohlo smazání cache. Původní situaci se mi už nepodařilo nasimulovat.

Verze MySQL:
innodb_version 5.6.14
protocol_version 10
slave_type_conversions
version 5.6.14
version_comment MySQL Community Server (GPL)
version_compile_machine i386
version_compile_os osx10.7

n.u.r.v.
Člen | 485
+
0
-

Ahoj, tak teď jsem se s tím setkal taky… Bohužel tentokrát smazání cache ani smazání a znovu naimportování DB tabulky nepomohlo – stále to vracelo int 1. Ale když jsem si dal vypsat ->getInsertId(); tak mi to vrátilo správně poslední vložené ID…

Tabulka má opravdu PK auto increment:

CREATE TABLE `questions_answers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `QUESTION_CS` text COLLATE utf8_czech_ci NOT NULL,m
  ...
  ...
  PRIMARY KEY (`ID`),
  KEY `IX_questions_answers_TEST_DEF_ID_TEST_SECTION_ID` (`TEST_DEFINITION_ID`,`TEST_SECTION_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;