Jak psát SQL queries v Latte?

Latte může být užitečným nástrojem i pro generování komplexních SQL dotazů, což zvyšuje jejich čitelnost a udržovatelnost.

Když SQL dotaz obsahuje mnoho podmínek a proměnných, může být jeho zápis v Latte přehlednější a flexibilnější. Zde je jednoduchý příklad demonstrující tuto výhodu:

SELECT users.* FROM users
	LEFT JOIN users_groups ON users.user_id = users_groups.user_id
 	LEFT JOIN groups ON groups.group_id = users_groups.group_id
	{ifset $country} LEFT JOIN country ON country.country_id = users.country_id {/ifset}
WHERE groups.name = 'Admins' {ifset $country} AND country.name = {$country} {/ifset}

Pro správné fungování je třeba provést několik kroků:

  1. Nastavení typu obsahu: pomocí $latte->setContentType() informujeme Latte, že obsah má být zpracován jako prostý text, nikoliv jako HTML.
  2. Definice escapovací funkce: vytvoříme vlastní escapovací funkci, která bude řetězce escapovat přímo pomocí databázového driveru. Tím zajistíme bezpečnost proti SQL injection.

Zde je ukázka implementace těchto kroků:

$db = new PDO(/* ... */);

$latte = new Latte\Engine;
$latte->setContentType(Latte\ContentType::Text);
$latte->addFilter('escape', fn($val) => match (true) {
	is_string($val) => $db->quote($val),
	is_int($val), is_float($val) => (string) $val,
	is_bool($val) => $val ? '1' : '0',
	is_null($val) => 'NULL',
	default => throw new Exception('Unsupported type'),
});

Tato escapovací funkce zajišťuje správné ošetření různých datových typů:

  • Řetězce jsou escapovány pomocí metody quote() databázového driveru.
  • Čísla (celá i s plovoucí desetinnou čárkou) jsou převedena na řetězce.
  • Booleovské hodnoty jsou převedeny na ‚1‘ nebo ‚0‘.
  • Null hodnoty jsou převedeny na ‚NULL‘.
  • Pro nepodporované typy je vyhozena výjimka.

Použití v praxi by pak vypadalo takto:

$sql = $latte->renderToString('query.sql.latte', ['country' => $country]);
$result = $db->query($sql);

Tento přístup umožňuje:

  1. Dynamické sestavování SQL dotazů s využitím logiky Latte.
  2. Bezpečné vkládání proměnných do dotazu díky vlastní escapovací funkci.
  3. Lepší čitelnost a udržovatelnost komplexních SQL dotazů.

Tento příklad vyžaduje Latte ve verzi 3.0.5 nebo novější.

Využití Latte pro generování SQL dotazů může výrazně zjednodušit práci s komplexními dotazy, zejména v situacích, kdy se dotaz dynamicky mění na základě různých podmínek. Zároveň tento přístup pomáhá udržet kód čistý a snadno upravitelný.

verze: 3.0