PHP8.1, Enum třídy a Doctrine
Jednou z novinek PHP8.1 je i podpora Enum tříd. Tento zápisek vznikl jako stručné intro k tomu, jak lze tuto novinku používat ve spojení s Doctrine.
Podpora Enum tříd se do Doctrine dostávala postupně, ale od verze 2.12.0 je snadné je v Symfony Entitách a Repozitářích Enumy používat. Podporované jsou BackedEnums, které obsahují string
nebo int
hodnotu, kterou je možné perzistovat do databáze.
Příklad - definice enum třídy
<?php
namespace App\Enum\Advert;
enum EstateType: string
{
case FLAT = 'flat';
case HOUSE = 'house';
}
Příklad - definice entity
Definice parametru estateType
- V anotaci musí být MySQL typ
string
neboint
podle typu Enumu. - Do anotace je nutné přidat enumType, např.
enumType=Enum\Advert\EstateType::class
- Je možné nadefinovat defaultní hodnotu pomocí Enumu.
- Enumy lze použít i u parametrů typu array.
Gettery a Settery
Při využití Enumu v definici parametru již není nutné pracovat s konkrétními hodnotami (string nebo int), protože Doctrine vrací přímo Enum.
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use App\Enum;
/**
* @ORM\Table(name="advert")
* @ORM\Entity(repositoryClass="App\Repository\AdvertRepository")
*/
class Advert
{
...
/**
* @ORM\Column(
* name="estate_type",
* type="string",
* enumType=Enum\Advert\EstateType::class,
* length=20,
* nullable=false
* )
*/
private Enum\Advert\EstateType $estateType = Enum\Advert\EstateType::FLAT;
public function setEstateType(Enum\Advert\EstateType $estateType): Advert
{
$this->estateType = $estateType;
return $this;
}
public function getEstateType(): Enum\Advert\EstateType
{
return $this->estateType;
}
...
Repozitář
S Enumy je možné rovněž pracovat i v metodách findBy z repozitářů.
$advertRepository = $this->em->getRepository(Entity\Advert::class);
return $advertRepository->findBy(['estateType' => Enum\Advert\EstateType::FLAT]);
Lze je rovněž zadávat i jako hodnoty parametrů pro QueryBuilder.
$qb = $this->createQueryBuilder('advert');
$qb
->where('advert.estateType = :estateType')
->setParameter('estateType', Enum\Advert\EstateType::FLAT);
Mohlo by vás také zajímat
Sentry Performance, PHP a GraphQL
Jak využít Sentry Performance pro monitoring výkonu PHP aplikace včetně výkonu GraphQL API.
Číst vícePotřebujete více informací?
Zpráva byla úspěšně odeslána.
Děkujeme
Omlouváme se, ale zprávu se nepovedlo odeslat.
Budeme rádi, když nám o tomto dáte vědět na info@id-sign.com