Relations entre les entités
Comment gérer les relations entre les entités avec Doctrine
Notions théoriques
Dans une base de données relationnelle, les tables peuvent être liées entre elles par des relations.
Doctrine supporte les types de relations suivants :
- OneToOne,
- OneToMany,
- ManyToOne
- et ManyToMany.
Par exemple, si chaque joueur de notre jeu a plusieurs personnages,
nous pourrions avoir une relation OneToMany entre l'entité Player
et une nouvelle entité Character
.
Pour cela, nous devons :
- ajouter une propriété
characters
àPlayer
- ajoutyer une propriété
player
àCharacter
, - utiliser les attributs de Doctrine pour définir la relation.
Exemple de mise en application
Voici une entité Character
dans le fichier src/Entity/Character.php
:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\CharacterRepository;
#[ORM\Entity(repositoryClass: CharacterRepository::class)]
#[ORM\Table(name: 'tbl_character')]
class Character
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column(type: "integer")]
private ?int $id = null;
#[ORM\Column(type: "string", length: 100)]
private string $name;
#[ORM\ManyToOne(targetEntity: Player::class, inversedBy: "characters")]
private Player $player;
public function getId(): ?int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getPlayer(): Player
{
return $this->player;
}
public function setPlayer(Player $player): self
{
$this->player = $player;
return $this;
}
}
Et voici l'ajout de la propriété characters
dans l'entité Player
:
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\PlayerRepository;
#[ORM\Entity(repositoryClass: PlayerRepository::class)]
#[ORM\Table(name: 'tbl_player')]
class Player
{
// ... autres propriétés ...
#[ORM\OneToMany(targetEntity: Character::class, mappedBy: "player")]
private Collection $characters;
public function __construct()
{
$this->characters = new ArrayCollection();
}
public function getCharacters(): Collection
{
return $this->characters;
}
public function addCharacter(Character $character): self
{
if (!$this->characters->contains($character)) {
$this->characters[] = $character;
$character->setPlayer($this);
}
return $this;
}
public function removeCharacter(Character $character): self
{
if ($this->characters->removeElement($character)) {
if ($character->getPlayer() === $this) {
$character->setPlayer(null);
}
}
return $this;
}
}
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Votre défi pour aujourd'hui consiste à créer une relation entre les joueurs et les personnages
- Créez une nouvelle entité
Character
avec une relation ManyToOne versPlayer
, - et ajoutez une relation OneToMany de
Player
àCharacter
. - Ensuite, codez une nouvelle action dans votre
GameController
qui crée un nouveau personnage pour un joueur existant.
Une solution
Vous devez être connecté pour voir le contenu.