Discussion entity
Nous allons créer un système de messagerie avec plusieurs participants dans plusieurs discussions.
En utilisant la commande php bin/console make:entity
nous allons créer une entité Discussion qui contiendra pour le moment les participants. Créez simplement l'attribut participants
avec une relation en ManyToMany
sur User
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\DiscussionRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ApiResource()
* @ORM\Entity(repositoryClass=DiscussionRepository::class)
*/
class Discussion
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity=User::class)
*/
private $participants;
/**
* @ORM\OneToMany(targetEntity=Message::class, mappedBy="discussion", orphanRemoval=true)
*/
private $messages;
public function __construct()
{
$this->participants = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
/**
* @return Collection|User[]
*/
public function getParticipants(): Collection
{
return $this->participants;
}
public function addParticipant(User $participant): self
{
if (!$this->participants->contains($participant)) {
$this->participants[] = $participant;
}
return $this;
}
public function removeParticipant(User $participant): self
{
$this->participants->removeElement($participant);
return $this;
}
/**
* @return Collection|Message[]
*/
public function getMessages(): Collection
{
return $this->messages;
}
public function addMessage(Message $message): self
{
if (!$this->messages->contains($message)) {
$this->messages[] = $message;
$message->setDiscussion($this);
}
return $this;
}
public function removeMessage(Message $message): self
{
if ($this->messages->removeElement($message)) {
// set the owning side to null (unless already changed)
if ($message->getDiscussion() === $this) {
$message->setDiscussion(null);
}
}
return $this;
}
}
<?php
namespace App\Repository;
use App\Entity\Discussion;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Discussion|null find($id, $lockMode = null, $lockVersion = null)
* @method Discussion|null findOneBy(array $criteria, array $orderBy = null)
* @method Discussion[] findAll()
* @method Discussion[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class DiscussionRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Discussion::class);
}
// /**
// * @return Discussion[] Returns an array of Discussion objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('d')
->andWhere('d.exampleField = :val')
->setParameter('val', $value)
->orderBy('d.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?Discussion
{
return $this->createQueryBuilder('d')
->andWhere('d.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}
Nous pouvons maintenant créer des conversations avec des participants avec ce payload sur POST /api/discussions
{
"participants": [
"/api/users/10",
"/api/users/11",
"/api/users/12"
]
}
next
Commentaires
Connectez-vous pour laisser un commentaire