Класс Connection
Класс Connection представляет собой соединение с базой данных.
Он позволяет выполнять SQL-запросы напрямую, управлять транзакциями,
вставлять, обновлять и удалять записи, а также получать данные
в различных форматах. Экземпляр класса доступен через сервис
Doctrine\DBAL\Connection, который можно внедрить в контроллер
или сервис через механизм autowiring.
Синтаксис
use Doctrine\DBAL\Connection;
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
Пример
Давайте внедрим соединение в контроллер и выполним простой SQL-запрос:
<?php
namespace App\Controller;
use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(Connection $connection): Response
{
$res = $connection->fetchAllAssociative('SELECT * FROM article');
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[["id" => 1, "title" => "article 1"], ["id" => 2, "title" => "article 2"]]
Пример
Давайте выполним запрос с параметрами, чтобы безопасно подставить значение:
<?php
namespace App\Controller;
use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function show(Connection $connection): Response
{
$res = $connection->fetchAssociative(
'SELECT * FROM article WHERE id = ?',
[1]
);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["id" => 1, "title" => "article 1"]
Пример
Давайте выполним вставку записи и получим её идентификатор:
<?php
namespace App\Controller;
use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function create(Connection $connection): Response
{
$connection->insert('article', [
'title' => 'abcde',
'content' => 'hello'
]);
$res = $connection->lastInsertId();
return new Response((string) $res);
}
}
?>
Результат выполнения кода:
"3"
Пример
Давайте обернём несколько запросов в транзакцию:
<?php
namespace App\Controller;
use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function transfer(Connection $connection): Response
{
$connection->beginTransaction();
try {
$connection->update('article', ['title' => 'user'], ['id' => 1]);
$connection->update('article', ['title' => 'abcde'], ['id' => 2]);
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
}
return new Response('done');
}
}
?>
Результат выполнения кода:
"done"
Смотрите также
-
метод
executeQuery,
который выполняет SQL-запрос и возвращает результат -
метод
executeStatement,
который выполняет SQL-запрос без возврата результата -
метод
fetchAllAssociative,
который возвращает все строки результата -
метод
beginTransaction,
который начинает транзакцию