Autor Zpráva
piiiiiiiip
Profil
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
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
O tom vím. Problém je že mi to vrací jen 0.
Tomášeek
Profil
piiiiiiiip:
Tak děláš něco blbě. Z popisu to ale poznat nejde.
piiiiiiiip
Profil
Model:
 public function getLastId()
        {
            
            return $this->database->getInsertId();
        }
presenter:
dump($this->articleManager->getLastId());
U toho modelu jsem zkoušel dát getInsertId() i přímo k insert se stejným výsledkem (0).
T-fon
Profil
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;
piiiiiiiip
Profil
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
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
                         . . .
                    )
                    );
Problém je v tom že protože se ten druhý dotaz vykoná pětkrát (což je správně) tak se pětkrát vykoná i ten první dotaz (což je špatně). Místo 1x 1 to n tak dostanu s 5x 1 to 1.
T-fon
Profil
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
Kód z [#9] je kousek z metody saveData z kódu [#11]? Pak metodu saveData voláte vícekrát a při každém vložení dělá jeden insert na hlavní tabulku a několik dalších insertů do druhé tabulky.
piiiiiiiip
Profil
[#9] je v manageru a [#11] je v presenteru. Jak to tedy udělat tak aby se ten první dotaz provedl pouze jednou a ten druhý kolikrát potřebuji?
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
Jste si jistý, že
$this->saveDataOne->id
dokáže přistoupit k proměnné uvnitř metody?

Spíš zkuste přidat objektu s těmi metodami např. vlastnost saveDataLastId, kterou budete v první metodě plnit
$this->saveDataLastId = $row->id;
a ve druhé načítat
$this->saveDataLastId
piiiiiiiip
Profil
To vypadá že to funguje.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: