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 nebo int 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íce

Symfony, lokální server a důvěryhodný SSL certifikát v Chrome

Nastavte si důvěryhodný certifikát v Chrome i pro vývoj Symfony aplikací

Číst více

NGINX, PHP-FPM a memory_limit

Nastavení memory limitu pro PHP v konfiguraci NGINX a PHP-FPM

Číst více

nám. Republiky 28
301 00 Plzeň
Česká republika
IČ: 28006402
DIČ: CZ28006402

© 2002 - 2022 iD-SIGN BRANDS MENTIONED ABOVE ARE PROPERTY OF THEIR RESPECTIVE OWNER.