Le DiscriminatorMap
de Doctrine permet une gestion efficace des entités héritées.
Nous allons prendre l'exemple simple d'une classe Vehicle
pour créer deux classes qui vont en hériter : Bike
et Car
qui ont des attributs différents mais auront les mêmes que Vehicle
.
Avec Api-platform, on pourra faire un GET /vehicles
pour avoir tous les vehicules
GET bikes
pour tous les bikes et GET /cars
<?php namespace AppEntity; use ApiPlatformDoctrineOrmFilterOrderFilter; use ApiPlatformDoctrineOrmFilterSearchFilter; use ApiPlatformMetadataApiFilter; use ApiPlatformMetadataApiResource; use AppRepositoryVehicleRepository; use DoctrineORMMapping as ORM; #[ORMEntity(repositoryClass: VehicleRepository::class)] #[ORMInheritanceType('JOINED')] #[ORMDiscriminatorColumn(name: 'discr', type: 'string')] #[ORMDiscriminatorMap([ 'car' => Car::class, 'bike' => Bike::class ])] #[ApiResource] #[ApiFilter(OrderFilter::class)] class Vehicle { #[ORMId] #[ORMGeneratedValue] #[ORMColumn] private ?int $id = null; #[ORMColumn(length: 255)] #[ApiFilter(SearchFilter::class, strategy: 'partial')] private ?string $brand = null; #[ORMColumn] private ?DateTimeImmutable $createdAt = null; public function getId(): ?int { return $this->id; } public function getBrand(): ?string { return $this->brand; } public function setBrand(string $brand): static { $this->brand = $brand; return $this; } public function getCreatedAt(): ?DateTimeImmutable { return $this->createdAt; } public function setCreatedAt(DateTimeImmutable $createdAt): static { $this->createdAt = $createdAt; return $this; } }
<?php namespace AppEntity; use ApiPlatformDoctrineOrmFilterOrderFilter; use ApiPlatformMetadataApiFilter; use ApiPlatformMetadataApiResource; use AppRepositoryBikeRepository; use DoctrineORMMapping as ORM; #[ORMEntity(repositoryClass: BikeRepository::class)] #[ApiResource] #[ApiFilter(OrderFilter::class)] class Bike extends Vehicle { #[ORMColumn] private ?bool $hasCarrier = null; public function hasCarrier(): ?bool { return $this->hasCarrier; } public function setHasCarrier(bool $hasCarrier): static { $this->hasCarrier = $hasCarrier; return $this; } }
<?php namespace AppEntity; use ApiPlatformDoctrineOrmFilterOrderFilter; use ApiPlatformMetadataApiFilter; use ApiPlatformMetadataApiResource; use AppRepositoryCarRepository; use DoctrineORMMapping as ORM; #[ORMEntity(repositoryClass: CarRepository::class)] #[ApiResource] #[ApiFilter(OrderFilter::class)] class Car extends Vehicle { #[ORMColumn] private ?int $numberOfDoors = null; public function getNumberOfDoors(): ?int { return $this->numberOfDoors; } public function setNumberOfDoors(int $numberOfDoors): static { $this->numberOfDoors = $numberOfDoors; return $this; } }
Tout ce fait avec
#[ORMInheritanceType('JOINED')] #[ORMDiscriminatorColumn(name: 'discr', type: 'string')] #[ORMDiscriminatorMap([ 'car' => Car::class, 'bike' => Bike::class ])]
InheritanceType
peut également être SINGLE_TABLE
ce qui signifie que vous n'aurez qu'une seule table pour toutes vos entités
N'oubliez pas également sur les autres classes de rajouter extends Vehicle
Fusée 🚀