Nette NDBT – insert do více tabulek, použití prvního ID, jeden dotaz
- n.u.r.v.
- Člen | 485
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)