Novinky v Nette Database 3.1

před 4 lety od David Grudl  

S elegantním způsobem práce s transakcí přichází nová metoda transaction(). Předáme jí callback, který se spustí v transakci. Pokud při běhu dojde k vyhození jakékoliv výjimky, transakce se zahodí (rollback). Pokud vše proběhne v pořádku, transakce se potvrdí (commit).

Metoda Connection::transaction() vrací hodnotu vrácenou callbackem, můžeme si tak třeba předat insert id:

$id = $db->transaction(function ($db) {
	$db->query('DELETE FROM ...');
	$db->query('INSERT INTO ...');
	$id = $db->getInsertId();
	$this->savePerson(...);
	// ...
	return $id;
});

Volání transaction() může být i zanořeno, což zjednodušuje implementaci nezávislých celků. Tedy zmíněná metoda savePerson() může vypadat takto:

public function savePerson($data)
{
    $this->db->transaction(function () {
        $this->saveAddresses(...);
		...
	});
}

Srozumitelnost

Protože pro součást knihovny umožňující snadný objektový přístup k databázi se vžil název Database Explorer, tak i základní třída Nette\Database\Context mění název na Nette\Database\Explorer. Dále Nette postupně opouští předponu I v názvech rozhraní, což se týká i knihovny Database.

Samozřejmě nadále fungují původní názvy jako aliasy.

Další změny

  • Translátor SQL příkazů, což je srdce celé knihovny, je o něco opatrnější a více kontroluje vstupy.
  • Driver MySqlDriver používá subqueries.
  • Minimální požadovaná verze PHP je 7.2.

Komentáře

  1. Doce by mě zajímalo, proč to $database předáváš v use a ne přímo jako parametr funkce. Když si tam takto vrazím instanci jiné connection, tak to moc transakční nebude ;)

    před 4 lety
  2. Jak si na tom příkladu chytím třeba to, že došlo k rollbacku a já si budu chtít udělat třeba nějakej custom log? A jak zjistím, že došlo ke commitu bez chyby? Tím, že mi to vrátí nějaké číslo jako idéčko například nebo jinou návratovou hodnotu například true? Řekněme, že pokud nedojde k rollbacku na uvedeném příkladu, tak chci redirect na adresu právě s tím id co to vrátí. To bych udělal jak (asi to vyplyny z první otázky jak chytit rollback pro nějakou custom operaci)? Děkuji za doplnění.

    před 4 lety · replied [3] uestla
  3. #2 ViPEr*CZ* Když dojde k výjimce během transakce, tak se transakce rollbackne a vzápětí se daná výjimka znovu vyhodí, podívej se do kódu: https://github.com/…nnection.php#L174

    před 4 lety
  4. @uestla jo super moooc díky. (určitě bych to taky našel… raději tedy v nějaké dokumentaci než koukat do zdrojáků … ale tohle určitě bude na API… ještě jednou díky )

    před 4 lety
  5. V dokumentaci to samozřejmě je, ale pokud to není srozumitelné, což je klidně možné, pošli prosím PR.

    před 4 lety

Chcete-li odeslat komentář, přihlaste se