PostgreSQL a aktuální id po insertu (currval)

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

Mám tabulku

create table dap (
	id serial primary key,
	subject_id integer references subject,
	rok_id smallint references rok,
)

a potřebuji samozřejmě po insertu získat id, takže jsem napsal metodu:

<?php
public function createDap ($rok_id, $subject_id) {
		$this->connection->table('dap')->insert (array('rok_id'=>$rok_id, 'subject_id'=>$subject_id));
		return $this->connection->table('dap')->select("currval('dap_id_seq')");
	}
?>

Metoda vytváří nový záznam, ale jeho id nevrací. V čem dělám chybu?

Ot@s
Backer | 476
+
0
-

Insert (pro Nette\Database) vrací Table\ActiveRow, tj:

public function createDap ($rok_id, $subject_id) {
	// neopomnet zachytit pripadnou chybu via. try {} catch () {}
	$newrow = $this->connection->table('dap')->insert (array('rok_id'=>$rok_id, 'subject_id'=>$subject_id));
	return $newrow->id;
}
jik
Člen | 146
+
0
-

Tento zápis se mi líbí, použiji ho, ale, tomu nerozumím, vypadne z něj:

data private => array(1) ▼ {
 id => 2012
}

Což je ovšem hodnota položky rok_id, nikoliv id. Jakoby vzal první, co mu přišlo pod ruku a obsahovalo ‚id‘.

Ještě doplnění: Pokud si nechám vrátit celý záznam, tak dostanu:

data private => array(2) ▼ {
	rok_id => 2012
	subject_id => 6019
}

tedy to id se zpátky nevrací.

Editoval jik (22. 8. 2012 13:36)

Ot@s
Backer | 476
+
0
-

Prubni ještě vysypat keš aplikace.

jik
Člen | 146
+
0
-

Ne-e, nepomohlo.

Ještě bych měl napsat, že se jedná o Nette verze 2.1-dev z 30.7. Nějaké sestavení, nebo něco takového nevidím.

Editoval jik (22. 8. 2012 14:09)

Ot@s
Backer | 476
+
0
-

jik napsal(a):

Ne-e, nepomohlo.

Ještě bych měl napsat, že se jedná o Nette verze 2.1-dev z 30.7. Nějaké sestavení, nebo něco takového nevidím.

S 2.1-dev Ti neporadím. Ve stabilní větvi by to takto mělo fungovat. Prozatím to asi obejdi něčím takovým (psáno z hlavy):

public function createDap ($rok_id, $subject_id) {
	$seq = $this->connection->table('dap')->select("nextval('dap_id_seq')")->fetch();
	$id = $seq->nextval;
	$this->connection->table('dap')->insert (array('id'=> $id, 'rok_id'=>$rok_id, 'subject_id'=>$subject_id));
	return $id;
}
jik
Člen | 146
+
0
-

Jo, takto to chodí, díky. Ono to je asi něco, co ještě není dodělané, verze 2.0.3 s PostgreSQL nechodí vůbec.

Editoval jik (22. 8. 2012 18:58)

jik
Člen | 146
+
0
-

Beru zpět, zatím to nejede, motám se v tom, ke všemu jsem dostal zprávu Table dap does not have any primary key.
Jakým způsobem Nette identifikuje primární klíče tabulek? Nemůže tam být nějaká kolize jmen? Tato tabulka má položku id, která je primárním klíčem, takto mám povícero tabulek a zatím problémy nikde jinde nebyly.
Aktuální podoba modelu:

<?php
public function createDap ($rok_id, $subject_id) {
	return $this->connection->table('dap')->
		insert (array('rok_id'=>$rok_id, 'subject_id'=>$subject_id));
	return $this->connection->table('dap')->select('id')->
		where (array('rok_id'=>$rok_id, 'subject_id'=>$subject_id))->
		limit(1)->fetch();
}
?>

V presenteru teď operuji nějak takto:

<?php
$this->template->dapi = $this->context->dap->createDap($this->rok, $this->sid);
?>

Nelíbí se pokus o vyčíslení {$dapi} v šabloně – hlásí neexistující primární klíč.

Editoval jik (22. 8. 2012 19:05)