Jak získám z tohoto insertu jeho ID

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

Ahoj všem,
snažím se posunout někam v PHP, takže jsem se začal trápit s nette ale trochu mi uniká jak z tohoto insertu

$this->getTable()->insert(array(
	    'nazev'=>$jmeno,
	    'poloha_x'=>$poloha_x,
	    'poloha_y'=>$poloha_y,
	    'pocetLidi'=>$pocetLidi,
		'rozloha'=>$rozloha,
		'uzivatel_id'=>\Nette\Environment::getUser()->getId(),
		'imuni'=>2000,
		'rodine'=>$rodine,
		'cihlove'=>$cihlove,
		'panelove'=>$panelove,
		'vezaky'=>$vezaky,
		'firmy'=>$firmy

	));

získám „LastInsertId“. Sloupce s ID se jmenuje „ID“
Díky moc za pomoc.

David Matějka
Moderator | 6445
+
0
-

ten insert by mel vracet instanci ActiveRow, takze:

$row = $this->getTable()->insert(array(....));
$row->id;

alternativou je pouzit metodu lastInsertId v 2.0 respektive getInsertId v 2.1 v Nette\Database\Connection

vosy
Člen | 532
+
0
-
$this->database->lastInsertId()
cs_paladin
Člen | 7
+
0
-

vosy napsal(a):

$this->database->lastInsertId()

Díky bohužel to nefunguje hlásí to chybu.
Používám Nette 2.0.12

Nette\MemberAccessException

Cannot read an undeclared property WebGame\MestoRepository::$database. search►

Source file ►

Call stack ▼

...\libs\Nette\common\Object.php:126	 source ►  Nette\ObjectMixin::	 get (arguments ►)

...\app\model\MestoRepository.php:58	 source ►  Nette\Object->	 __get (arguments ►)

48:            'uzivatel_id'=>\Nette\Environment::getUser()->getId(),
49:            'imuni'=>2000,
50:            'rodine'=>$rodine,
51:            'cihlove'=>$cihlove,
52:            'panelove'=>$panelove,
53:            'vezaky'=>$vezaky,
54:            'firmy'=>$firmy
55:
56:        ));
57:
58:            echo $this->database->lastInsertId();
59:
60:        }
61:
62:        public function getIdMesta($jmeno)
...\app\presenters\MestoPresenter.php:36	 source ►  WebGame\MestoRepository->	 zalozMesto (arguments ►)

inner-code	 MestoPresenter->	 noveMestoSubmitted (arguments ►)

...\libs\Nette\common\Callback.php:100	 source ►  call_user_func_array (arguments ►)

...\libs\Nette\common\ObjectMixin.php:59	 source ►  Nette\Callback->	 invokeArgs (arguments ►)

...\libs\Nette\common\Object.php:79	 source ►  Nette\ObjectMixin::	 call (arguments ►)

...\libs\Nette\Forms\Form.php:405	 source ►  Nette\Object->	 __call (arguments ►)

...\libs\Nette\Forms\Form.php:405	 source ►  Nette\Application\UI\Form->	 onSuccess (arguments ►)

...\libs\Nette\Application\UI\Form.php:131	 source ►  Nette\Forms\Form->	 fireEvents ()

...\libs\Nette\Application\UI\Presenter.php:302	 source ►  Nette\Application\UI\Form->	 signalReceived (arguments ►)

...\libs\Nette\Application\UI\Presenter.php:185	 source ►  Nette\Application\UI\Presenter->	 processSignal ()

...\libs\Nette\Application\Application.php:128	 source ►  Nette\Application\UI\Presenter->	 run (arguments ►)

...\www\index.php:10	 source ►  Nette\Application\Application->	 run ()

Editoval cs_paladin (19. 9. 2013 8:49)

cs_paladin
Člen | 7
+
0
-

matej21 napsal(a):

ten insert by mel vracet instanci ActiveRow, takze:

$row = $this->getTable()->insert(array(....));
$row->id;

alternativou je pouzit metodu lastInsertId v 2.0 respektive getInsertId v 2.1 v Nette\Database\Connection

Tohle zase vrací vždy číslo 1 :-(

Badaboom
Člen | 33
+
0
-

Přečetl jsi si tu chybu vůbec?

Nejde vůbec o metodu lastInsertId, ale že se ji snažíš volat nad nedeklarovanou proměnnou. Metoda lastInsertId patří PDO, ze které dědí Nette\Database\Connection

A způsob, který nastínil matej21 funguje. Jenom je třeba si dávat pozor na to, že funguje pouze při vložení nového řádku a INSERT … SELECT namísto ActiveRow vrací počet řádků. Také update ActiveRow nevrací.

Oba způsoby fungují na Nette 2.0.12, jenom je špatně používáš.

Zkus poslat obsah proměnné $row.

$row = $this->getTable()->insert(array(....));
dump($row);
exit;
cs_paladin
Člen | 7
+
0
-

četl, bohužel nevím jak udělat aby si to správně zdědil, vlastně jsem nejdřív jel podle tutorialu a pak jsem si to pomalu začal točit na svojí věc

Nette\Database\Table\ActiveRow(4) {
   table private => Nette\Database\Table\Selection(18) {
      connection protected => Nette\Database\Connection(6) {
         dsn private => "mysql:host=localhost;dbname=webgame" (35)
         driver private => Nette\Database\Drivers\MySqlDriver(1) { ... }
         preprocessor private => Nette\Database\SqlPreprocessor(6) { ... }
         databaseReflection private => Nette\Database\Reflection\DiscoveredReflection(5) { ... }
         cache private => Nette\Caching\Cache(4) { ... }
         onQuery => array(1) [ ... ]
      }
      cache protected => Nette\Caching\Cache(4) {
         storage private => Nette\Caching\Storages\FileStorage(4) { ... }
         namespace private => "Nette.Database.043dfc14c489014cffc975c040d3970a\x00" (48)
         key private => NULL
         data private => NULL
      }
      sqlBuilder protected => Nette\Database\Table\SqlBuilder(14) {
         driver private => Nette\Database\Drivers\MySqlDriver(1) { ... }
         driverName private => "mysql" (5)
         tableName protected => "mesto" (5)
         databaseReflection protected => Nette\Database\Reflection\DiscoveredReflection(5) { ... }
         delimitedTable protected => "`mesto`" (7)
         select protected => array(0)
         where protected => array(0)
         conditions protected => array(0)
         parameters protected => array(0)
         order protected => array(0)
         limit protected => NULL
         offset protected => NULL
         group protected => ""
         having protected => ""
      }
      name protected => "mesto" (5)
      primary protected => "ID" (2)
      primarySequence protected => NULL
      rows protected => array(1) {
         62 => Nette\Database\Table\ActiveRow(4) { *RECURSION* }
      }
      data protected => NULL
      dataRefreshed protected => FALSE
      referenced protected => array(0)
      referencing protected => array(0)
      referencingPrototype protected => array(0)
      aggregation protected => array(0)
      accessedColumns protected => NULL
      previousAccessedColumns protected => NULL
      observeCache protected => FALSE
      checkReferenced protected => TRUE
      keys protected => array(0)
   }
   data private => array(13) {
      nazev => "MiraPolis" (9)
      poloha_x => 7893
      poloha_y => 1319
      pocetLidi => 5546
      rozloha => 5608
      uzivatel_id => 1
      imuni => 2000
      rodine => 1109.0
      cihlove => 555.0
      panelove => 1941.0
      vezaky => 1664.0
      firmy => 555.0
      ID => "62" (2)
   }
   dataRefreshed private => FALSE
   modified private => array(0)
}
David Matějka
Moderator | 6445
+
0
-
$row->ID;
cs_paladin
Člen | 7
+
0
-

matej21 napsal(a):

$row->ID;

To je ono, ať žije zvyk z windowsů, velikost znaků. Super díky moc. Díky moc všem.

mildhouse
Člen | 27
+
0
-

Tady pozor na to, abys neukládal ID, např.:

// špatně
$row = $this->getTable()->insert(array('id' => 50, 'hodnota1' => $hodnota1, 'hodnota2' => $hodnota2));
// sloupec id je pravděpodobně auto increment, takže DB si to doplní sama např. na 123, ale...
echo $row->id; // 50

// správně
$row = $this->getTable()->insert(array('hodnota1' => $hodnota1, 'hodnota2' => $hodnota2));
// sloupec id je pravděpodobně auto increment, takže DB si to doplní sama např. na 123, pak...
echo $row->id; // 123

Nevim, jak u verze 2.1, ale u 2.0.x jsem na to narazil při kopírování z tabulky do tabulky (do archivu)