Symfony používa Doctrine ORM (Object-Relational Mapping) na prácu s databázou. Doctrine umožňuje vývojárom pracovať s databázou pomocou PHP objektov namiesto priameho písania SQL dotazov. Tento článok vám ukáže, ako Doctrine funguje, ako nastaviť pripojenie k databáze, vytvoriť entity a vykonávať CRUD operácie.
Doctrine ORM je výkonný nástroj, ktorý umožňuje:
Bez Doctrine ORM by vývojári museli písať vlastné SQL dotazy, čo je časovo náročné a menej flexibilné.
Doctrine ORM využíva .env súbor na konfiguráciu databázového pripojenia. Ak chcete používať MySQL
, otvorte súbor .env a upravte riadok:
DATABASE_URL="mysql://root:heslo@127.0.0.1:3306/mojadb"
php bin/console doctrine:database:create
Ak všetko prebehlo úspešne, databáza bola vytvorená a môžete začať s tvorbou tabuliek.
Entity v Doctrine sú triedy, ktoré reprezentujú tabuľky v databáze. Každý stĺpec v tabuľke zodpovedá jednému atribútu v entite.
Product:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'products')]
class Product
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string', length: 100)]
private string $name;
#[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
private float $price;
// Gettery a settery
}
?>
php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate
Tento príkaz automaticky vygeneruje SQL dotazy na vytvorenie tabuľky products.
<?php
$entityManager = $this->getDoctrine()->getManager();
$product = new Product();
$product->setName('Laptop');
$product->setPrice(999.99);
$entityManager->persist($product);
$entityManager->flush();
?>
$product = $entityManager->getRepository(Product::class)->find(1); echo $product->getName();
$product->setPrice(1099.99); $entityManager->flush();
$entityManager->remove($product); $entityManager->flush();
Ak chcete pracovať s vlastnými dotazmi, môžete vytvoriť vlastný repository súbor.
<?php
namespace App\Repository;
use App\Entity\Product;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class ProductRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Product::class);
}
public function findExpensiveProducts(float $price): array
{
return $this->createQueryBuilder('p')
->where('p.price > :price')
->setParameter('price', $price)
->getQuery()
->getResult();
}
}
?>
$expensiveProducts = $productRepository->findExpensiveProducts(500);
Použite príkazy:
php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate
Stačí nakonfigurovať viaceré pripojenia v doctrine.yaml a použiť parameter connection.
$products = $entityManager->getRepository(Product::class)->findAll();
Ak máte záujem o prezenčné alebo online školenie programovania v PHP, pozrite si našu ponuku na www.like-it.sk. Naše kurzy vedú skúsení odborníci, ktorí vám pomôžu zvládnuť Symfony od základov až po pokročilé koncepty.
Viac informacií preberáme na kurze:
Kurz PHP - Programovanie dynamických webových stránok v PHP a úvod do AJAXu
Marián Knězek