PostgreSQL a aktuální id po insertu (currval)
- jik
- Člen | 146
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
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
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
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
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)