Jak uložit editovaný záznam pod jiným id?

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

Ahoj,
v aplikaci bych potřeboval udělat abych si mohl hodnoty uložené v db po vytažení do editačního formuláře uložit pod jiným id. Zkusil jsem v modelu toto:

return $this->getTable()->insert(array(  //insert místo find($id)->update(array(
                   'id' => $id++

Ale bohužel mě to id nenavýší a po odeslání formuláře s upravenými hodnotami mě laděnka hodí chybu s duplikací hodnot pro stejné id.

Jak tedy editovaná data uložit pod jiným id(o jedno větším)?

Díky za rady

xxxmisko
Člen | 140
+
0
-

skús tam napísať ++$id

ZZromanZZ
Člen | 87
+
0
-

Co vynechat primární klíč ? V tvém případě nejspíš $id a nadefinovat celý parametr(array pro insert) nově. Nepomůže to ?

.:M@rt!n:.
Člen | 201
+
0
-

Zaměnit $id++ za ++$id pomohlo (id se zvětšilo), ale teď mám problém s cizím klíčem do jiné tabulky ale to už snad vyřeším

ZZromanZZ
Člen | 87
+
0
-

To co děláš je hodně divné, o inkrementaci id by se ti měl starat přímo SŘBD.

.:M@rt!n:.
Člen | 201
+
0
-

Jo to on se stará stará v pohodě při vkládání nového záznamu. Ale já potřebuji z editovaného záznamu v db udělat zcela nový záznam a tam si id musím změnit růčo. Původní záznam zůstane nezměněn.

ZZromanZZ
Člen | 87
+
0
-

pokud ti nevadi a ani by ti nemelo vadit, ze nove id nebude o jedna vetsi, tak zkus naseldujici

$this->getTable()->insert(array(
    //uplne vynechat $id
    "column1"  => $oldRecord->column1,
    "column2"  => $oldRecord->column2,
  ...
));
wb2009
Člen | 125
+
0
-

Přesně tak jak píše ZZromanZZ

normálně udělej na v té funkci, která pracuje s hodnotami z formuláře insert do databáze, s tím, že dostaneš nějaké jiné nové ID, nebo nám vysvětli proč potřebuješ přesně o jednotku větší? A pokud to potřebuješ, jak řešíš to, že jiný uživatel mezitím co ty budeš přeukládat hodnoty, neinsertně něco nového a nedostane to id o jednotku větší…

nebo jinak, co to duplikovat? Když poprvé vložíš hodnoty, tak se uloží dvakrát? Tedy s id X další záznam ten samý s id X+1?

Jan Mikeš
Člen | 771
+
0
-

Proc tak slozite??? Duplikace zasnamu s vynechanim id (o inkrementaci se postara auto_increment atribut):

$oldRow = $this->getTable()->find($id); // Returns Nette\Database\Table\ActiveRow
$oldRowValues = $oldRow->toArray();
unset($oldRowValues["id"]);
$this->getTable()->insert($oldRowValues);

Editoval Lexi (4. 6. 2013 18:27)

ZZromanZZ
Člen | 87
+
0
-

O primární klíč (postavený nad unsigned int), by se měl starat SŘBD, na ten se pak pouze odkazuješ v aplikaci.
MySQL(InnoDB) typicky posouvá o jedna při každém pokusu, i při chybném vložení při kterém by se porušila integrita.
Proto, se může stát, že nejdou sekvenčně za sebou a vznikne „díra“. Je to kvůli souběžnému vkládání řádků do db, každý insert si zabere jednu hodnotu a nemusí na sebe aspoň čekat. Pokud spadne vznikne díra a další insert má hold hodnotu o jedna vetší. Není to naškodu. Ale to jen tak naokraj.

Lexiho ukázka je ekvivalentní k tomu co jsem napsal.

.:M@rt!n:., závěr je ten, že si neumím představit, proč bys měl takhle vyplňovat PK v aplikaci.

Editoval ZZromanZZ (4. 6. 2013 19:03)

Jan Mikeš
Člen | 771
+
0
-

Je to ekvivalentni, ale s tim, ze u meho reseni nemusis vypisovat vsech 50 sloupcu ve sve rozsahle tabulce ;).

ZZromanZZ
Člen | 87
+
0
-

Tvoje řešení je samozřejmě praktičtější, já jenom nerad dávám lidem kompletní univerzální řešení, je lepší je podnítit k nápadům, a oni pak mají alespoň vetší radost, že na to přišli sami :-D