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.