Nette Database
Nette Database — це потужний та елегантний шар бази даних для PHP з акцентом на простоту та розумні функції. Він пропонує два способи роботи з базою даних — Explorer для швидкої розробки додатків або SQL підхід для прямої роботи з запитами.
SQL підхід
- Безпечні параметризовані запити
- Точний контроль над формою SQL-запитів
- Коли ви пишете складні запити з розширеними функціями
- Оптимізуєте продуктивність за допомогою специфічних функцій SQL
Explorer
- Розробляєте швидко, не пишучи SQL
- Інтуїтивна робота з відношеннями між таблицями
- Оціните автоматичну оптимізацію запитів
- Підходить для швидкої та зручної роботи з базою даних
Встановлення
Завантажте та встановіть бібліотеку за допомогою інструмента Composer:
composer require nette/database
Підтримувані бази даних
Nette Database підтримує наступні бази даних:
| Сервер бази даних | Ім'я DSN | Підтримка в Explorer |
|---|---|---|
| MySQL (>= 5.1) | mysql | ТАК |
| PostgreSQL (>= 9.0) | pgsql | ТАК |
| Sqlite 3 (>= 3.8) | sqlite | ТАК |
| Oracle | oci | – |
| MS SQL (PDO_SQLSRV) | sqlsrv | ТАК |
| MS SQL (PDO_DBLIB) | mssql | – |
| ODBC | odbc | – |
Два підходи до бази даних
Nette Database надає вам вибір: ви можете або писати SQL-запити безпосередньо (SQL підхід), або дозволити генерувати їх автоматично (Explorer). Давайте подивимося, як обидва підходи вирішують однакові завдання:
SQL підхід – SQL-запити
// вставка запису
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// отримання записів: автори книг
$result = $database->query('
SELECT authors.*, COUNT(books.id) AS books_count
FROM authors
LEFT JOIN books ON authors.id = books.author_id
WHERE authors.active = 1
GROUP BY authors.id
');
// виведення (не оптимально, генерує N додаткових запитів)
foreach ($result as $author) {
$books = $database->query('
SELECT * FROM books
WHERE author_id = ?
ORDER BY published_at DESC
', $author->id);
echo "Автор $author->name написав $author->books_count книг:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Explorer підхід – автоматичне генерування SQL
// вставка запису
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// отримання записів: автори книг
$authors = $database->table('authors')
->where('active', 1);
// виведення (автоматично генерує лише 2 оптимізовані запити)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "Автор $author->name написав {$books->count()} книг:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Підхід Explorer генерує та оптимізує SQL-запити автоматично. У наведеному прикладі SQL підхід генерує N+1 запитів (один для авторів, а потім один для книг кожного автора), тоді як Explorer автоматично оптимізує запити та виконує лише два – один для авторів та один для всіх їхніх книг.
Обидва підходи можна вільно комбінувати в додатку за потреби.
Підключення та конфігурація
Для підключення до бази даних достатньо створити екземпляр класу Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Параметр $dsn (data source name) такий самий, який використовує
PDO, наприклад mysql:host=127.0.0.1;dbname=test. У разі збою викидається
виняток Nette\Database\ConnectionException.
Однак, зручніший спосіб пропонує конфігурація
програми, куди достатньо додати секцію database, і будуть
створені необхідні об'єкти, а також панель бази даних у Tracy барі.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Потім об'єкт з'єднання отримаємо як сервіс з DI-контейнера, наприклад:
class Model
{
public function __construct(
// або Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Більше інформації про конфігурацію бази даних.
Ручне створення Explorer
Якщо ви не використовуєте Nette DI-контейнер, ви можете створити
екземпляр Nette\Database\Explorer вручну:
// підключення до бази даних
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// сховище для кешу, реалізує Nette\Caching\Storage, наприклад:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// відповідає за рефлексію структури бази даних
$structure = new Nette\Database\Structure($connection, $storage);
// визначає правила для відображення назв таблиць, стовпців та зовнішніх ключів
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Управління підключенням
При створенні об'єкта Connection підключення відбувається
автоматично. Якщо ви хочете відкласти підключення, використовуйте
режим lazy – його можна увімкнути в конфігурації,
встановивши lazy: true, або так:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Для управління підключенням використовуйте методи connect(),
disconnect() та reconnect().
connect()створює підключення, якщо його ще немає, при цьому може викликати винятокNette\Database\ConnectionException.disconnect()відключає поточне підключення до бази даних.reconnect()виконує відключення та подальше повторне підключення до бази даних. Цей метод також може викликати винятокNette\Database\ConnectionException.
Крім того, ви можете відстежувати події, пов'язані з підключенням, за
допомогою події onConnect, яка є масивом колбеків, що викликаються
після встановлення з'єднання з базою даних.
// виконується після підключення до бази даних
$database->onConnect[] = function($database) {
echo "Підключено до бази даних";
};
Tracy Debug Bar
Якщо ви використовуєте Tracy, автоматично активується панель Database в Debug барі, яка відображає всі виконані запити, їхні параметри, час виконання та місце в коді, де вони були викликані.
