Nette NDBT – insert do více tabulek, použití prvního ID, jeden dotaz

n.u.r.v.
Člen | 485
+
0
-

Ahoj, v jednom projektu budeme při zakládání uživatele zakládat data v několika tabulkách, přičemž ostatní tabulky potřebují ID z první tabulky

V klasickém SQL by se to dělalo jedním dotazem např. takto:

	  START TRANSACTION;
      INSERT INTO table1 (NAME, FIRST_NAME,...)
      VALUES (...);
      INSERT INTO table2 (ID_TABLE1, NAME, FIRST_NAME,...)
      VALUES (@ID_TABLE1:= LAST_INSERT_ID(), ...);
...atd
      COMMIT;

A já bych potřeboval poradit, jak to správně napsat v nette včetně ošetření vstupních hodnot když používám ndbt…

Zde na foru jsem našel že bych to měl dělat nějak takto:

private $database = Nette\Database\Context...
...
...
private function createUser($dataTable1, $dataTable2, $dataTable3){
        $this->database->beginTransaction();
        $insertTable1 = $this->database->table('table1')->insert($dataTable1);
        $dataTable2['ID1'] = $insertTable1->ID;
        $insertTable2 = $this->database->table('table2')->insert($dataTable2);
        $dataTable3['ID1'] = $insertTable1->ID;
        $insertTable3 = $this->database->table('table3')->insert($dataTable3);
        $this->database->commit();
        return ...
    }

Ale když jsem to odpálil, tak tracy stejně ukazovala asi 8 jednotlivých dotazů a já bych potřeboval to nějak udělat jedním dotazem a na konci získat ID z prvního insertu, které vrátím…

Díky za pomoc

Edit:

Napadlo mě generovat mysql query ručně a pak to hodit do $database->query($sql); ale nevím jak získat první ID ve třetím a dalších insertech (u druhého insertu to řeší LAST_INSERT_ID()) a nevím jak ošetřit vstupní data…

Editoval n.u.r.v. (18. 7. 2017 15:17)