Nette Documentation Preview

syntax
Как писать SQL-запросы в Latte?
*******************************

.[perex]
Latte может пригодиться и для того, чтобы более читаемо формировать действительно сложные SQL-запросы.

Если в построении SQL-запроса участвует множество условий и переменных, запись в Latte заметно повышает наглядность. Вот совсем простой пример:

```latte
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}
```

С помощью `$latte->setContentType()` мы говорим Latte, что содержимое нужно воспринимать как обычный текст (не HTML). Затем готовим функцию экранирования, которая для корректного экранирования строк использует драйвер базы данных:

```php
$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'),
});
```

Использование будет выглядеть так:

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

*Для этого примера требуется Latte v3.0.5 или новее.*

Как писать SQL-запросы в Latte?

Latte может пригодиться и для того, чтобы более читаемо формировать действительно сложные SQL-запросы.

Если в построении SQL-запроса участвует множество условий и переменных, запись в Latte заметно повышает наглядность. Вот совсем простой пример:

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}

С помощью $latte->setContentType() мы говорим Latte, что содержимое нужно воспринимать как обычный текст (не HTML). Затем готовим функцию экранирования, которая для корректного экранирования строк использует драйвер базы данных:

$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'),
});

Использование будет выглядеть так:

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

Для этого примера требуется Latte v3.0.5 или новее.