Autor | Zpráva | ||
---|---|---|---|
piiiiiiiip Profil |
#1 · Zasláno: 28. 12. 2017, 23:59:42
Ahoj.
Mám v db dvě tabulky 1:n. Když do nich chci uložit data (najednou) tak nejdříve vytvořím jeden zápis v té první tabulce a poté několik zápisů v té druhé tabulce. Problém je v tom že k těm zápisum v té druhé tabulce potřebuju do jednoho sloupce přidat id zápisu z té první tabulky, které samozdřejmě nemám (musel bych ho tahat přez další query což se mi nechce). Chtěl bych to tedy nějak obejít tzn. místo toho abych čekal než se mi to id vytvoří v db tak bych si chtěl vytvořit nějaký vlastní identifikátor. Přemýšlel jsem že bych tedy vytvořil nějaký hash (třeba md5) z nějakého uživatelského vstupu nebo náhodně vygenerovaný řetězec ale nevím jestly je to správné řešení. Chtěl bych se tedy zeptat jak se to má správně řešit. |
||
Keeehi Profil |
#2 · Zasláno: 29. 12. 2017, 03:27:26
Správně se to řeší, že si počkáš na vložení do první tabulky. Dalším dotazem to tahat nemusíš, vrátí ti to sama funkce/metoda insert_id. Pokud používáš něco jiného než mysqli_* tak tam to je podobně.
|
||
piiiiiiiip Profil |
#3 · Zasláno: 29. 12. 2017, 13:04:11
O tom vím. Problém je že mi to vrací jen 0.
|
||
Tomášeek Profil |
#4 · Zasláno: 29. 12. 2017, 13:33:14
piiiiiiiip:
Tak děláš něco blbě. Z popisu to ale poznat nejde. |
||
piiiiiiiip Profil |
#5 · Zasláno: 29. 12. 2017, 14:01:43
Model:
public function getLastId() { return $this->database->getInsertId(); } dump($this->articleManager->getLastId()); |
||
T-fon Profil |
#6 · Zasláno: 29. 12. 2017, 14:23:21
Projdi si nette forum, tam se to řešilo. Vim že mi to kdysi taky někde nefungovalo a vyřešil jsem to nějak takto:
$row = $this->database->table(self::TABLE_NAME)->insert([...)]; $id = $row->id; |
||
Časová prodleva: 3 měsíce
|
|||
piiiiiiiip Profil |
#7 · Zasláno: 19. 3. 2018, 18:29:25
T-fon:
Toto nefunguje. Kdyz chci vložit jeden záznam do první tabulky a například pět záznamu do druhé tabulky tak se mi to do té první rovnež uloží pětkrát. |
||
T-fon Profil |
#8 · Zasláno: 19. 3. 2018, 19:40:34
Předpokládám, že teď řešíš něco jiného než původně. Já jsem ti napsal alternativní možnost, jak v Nette získat ID vloženého záznamu. Na to ses původně ptal. Čili ty nejprve vložíš jeden záznam do první tabulky, pak získáš ID toho vloženýho záznamu a nakonec vložíš pět záznamů do druhé tabulku s tím získaným ID. Netušim jak a co by se ti do první tabulky mohlo uložit 5x, když tam vkládaš jen jeden záznam. Kdyžtak sem vlož kod, kterým záznamy ukládáš, aby ti moh někdo poradit, kde máš chybu.
|
||
piiiiiiiip Profil |
Ano, řeším už něco jiného.
//Toto má vložit ten jeden záznam do db $row = $this->database->table(self::TABLE_NAME)->insert($data); //Toto získá ID toho záznamu $id = $row->id; //Toto má vložit tech pět záznamů do db $this->database->table(self::SECOND_TABLE_NAME)->insert( array( self::COLUMN_FOREIGN_ID => $id, //ID toho jednoho záznamu z prvního sql dotazu . . . ) ); |
||
T-fon Profil |
#10 · Zasláno: 20. 3. 2018, 06:59:15
A to máš celý v nějakém cyklu, který se provádí 5x? Tak z něj vyndej ten první dotaz a zjištění ID a v cyklu nech jen ten druhý dotaz.
|
||
piiiiiiiip Profil |
Ten druhý dotaz volám ve foreach a ten první ne. Ten druhý dotaz ale způsobí že se ten první odešle pokaždé, když si vyžádá to ID. Když to $id nezavolám tak to funguje tak jak má, jenomže já tam to $id potřebuju :D
$this->somethingManager->saveData($data); foreach ($form['translate']->values as $translationId => $translation) { $langId = $translation['language']; . . . $this->somethingManager->saveData($langId, . . .); } |
||
Kajman Profil |
#12 · Zasláno: 20. 3. 2018, 14:13:18
|
||
piiiiiiiip Profil |
#13 · Zasláno: 20. 3. 2018, 14:21:04
|
||
Kajman Profil |
Třeba dvě metody. Jedna na hlavní řádek, co si uloží do své proměnné id hlavního záznamu. Druhá, která to id bude využívat a také vloží jen jeden řádek (ta bude volaná cyklem pro ty jednotlivé jazyky).
|
||
piiiiiiiip Profil |
Myslíte takto?
public function saveDataOne($data) { $row = $this->database->table(self::TABLE_NAME)->insert($data); $id = $row->id; } public function saveDataTwo($langId, . . .) { $this->database->table(self::SECOND_TABLE_NAME)->insert( array( self::COLUMN_FOREIGN_ID => $this->saveDataOne->id, //ID toho jednoho záznamu z prvního sql dotazu . . . ) ); } Protože takhle to taky nefunguje. |
||
Kajman Profil |
#16 · Zasláno: 20. 3. 2018, 15:32:28
Jste si jistý, že
$this->saveDataOne->id Spíš zkuste přidat objektu s těmi metodami např. vlastnost saveDataLastId, kterou budete v první metodě plnit $this->saveDataLastId = $row->id; $this->saveDataLastId |
||
piiiiiiiip Profil |
To vypadá že to funguje.
|
||
Časová prodleva: 6 let
|
0