Работа с базой данных Symfony. Работа с ОРМ Doctrine.
Всё то же самое, с небольшим отличиями, есть в официальном руководстве:
https://symfony.com/doc/current/doctrine.html
Или на русском:
https://symfony.ru/doc/current/doctrine.html
В официальном руководстве о чем-то говорится больше, что-то пропускается в виду того, что вы сами должны догадаться. Здесь ниже я попробовал упростить и может быть более точно указать что и где нужно поставить.
Официальное руководство все же стоит почитать, там разжевывают некоторые моменты.
Устанавливаем инструменты для работы с БД
composer require --dev symfony/maker-bundle
Создание БД
Создаем базу данных
Команды доктрины
Установим maker
Создание таблиц и сущностей в них
Создаем сущность
Отвечаем на вопросы, подбирая подходящие для себя параметры.
Если понадобится в дальнейшем добавить новое поле в таблицу, то используем эту же команду.
Создаем (или обновляем) таблицу миграции для последующего внедрения в БД
В консоли будет указан файл, что-то вроде:
В нём будут параметры создания таблицы.
Запустим создание (или обновления) таблицы в БД:
Эту же команду стоит запустить на продакшене для обновления таблиц.
Если требуется пересоздать сущности, например в том случае, когда добавление происходит вручную через файл:
Контроллер
Контроллер нужен для сохранения объектов в базе данных.
Заменяем содержимое на
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
class ProductController extends AbstractController
{
/**
* @Route("/product", name="create_product")
*/
public function createProduct(): Response
{
// you can fetch the EntityManager via $this->getDoctrine()
// or you can add an argument to the action: createProduct(EntityManagerInterface $entityManager)
$entityManager = $this->getDoctrine()->getManager();
$product = new Product();
$product->setName('Keyboard');
$product->setPrice(1999);
$product->setDescription('Ergonomic and stylish!');
// tell Doctrine you want to (eventually) save the Product (no queries yet)
$entityManager->persist($product);
// actually executes the queries (i.e. the INSERT query)
$entityManager->flush();
return new Response('Saved new product with id '.$product->getId());
}
}
Добавляем в конец адресной строки сайта слово product и затем открываем:
Это создаст первую строку БД.
Проверить можно через консоль:
Получение объекта из БД
В том же файле ProductController.php добавим:
* @Route("/product/{id}", name="product_show")
*/
public function show($id)
{
$product = $this->getDoctrine()
->getRepository(Product::class)
->find($id);
if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$id
);
}
return new Response('Check out this great product: '.$product->getName());
// or render a template
// in the template, print things with {{ product.name }}
// return $this->render('product/show.html.twig', ['product' => $product]);
}
И перейдем:
Увидим получение указанных данных выше. В данном случае поля Name.
SensioFrameworkExtraBundle
Для автоматизации и упрощения процесса установим фреймворк:
Упростим метод public function show(Product $product)
* @Route("/product/{id}", name="product_show")
*/
public function show(Product $product)
{
return new Response('Check out this great product: '.$product->getPrice());
}
И снова откроем страницу:
Получим то же самое, что и в первом варианте.
Больше опций здесь:
https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
Обновление продукта
* @Route("/product/edit/{id}")
*/
public function update($id)
{
$entityManager = $this->getDoctrine()->getManager();
$product = $entityManager->getRepository(Product::class)->find($id);
if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$id
);
}
$product->setName('New product name!');
$entityManager->flush();
return $this->redirectToRoute('product_show', [
'id' => $product->getId()
]);
}
Удаление
* @Route("/product/remove/{id}")
*/
public function remove($id)
{
$entityManager = $this->getDoctrine()->getManager();
$product = $entityManager->getRepository(Product::class)->find($id);
if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$id
);
}
$entityManager->remove($product);
$entityManager->flush();
}
Открываем: