Bonjour à tous.

Je débute en Symfony avec la version 5.3 et PHP 7.4.9.

Je développe un site pour réserver des appartements pour des séjours de vacances.

J'ai créé un formulaire où l'utilisateur devra renseigner la date d'entrée, de sortie, l'appartement qu'il souhaite ( mais il sera aussi automatiquement généré si l'utilisateur clique sur l'appartement en question).

Le user sera celui qui est connecté.

Le but étant que les dates, par appartement, ne se chevauches pas si elles sont réservé. Mais pour l'instant même une date qui n'est pas réservé dans la bdd ne veut pas rentrer et je n'ai pas encor trouvé la raison.

Alors voilà mon soucis:

lorsque je clique sur envoyer le formulaire je recois cet erreur:

An exception occurred while executing 'INSERT INTO reservation (start, end, slug, user_id, room_id) VALUES (?, ?, ?, ?, ?)' with params ["2018-01-01", "2020-01-06", "-3", 2, 1]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ '1' pour la clef 'reservation.UNIQ_42C8495554177093'
Je me dis que c'est possiblement le champs slug qui ne vas pas car il existe déja sous le même slug. mais il est sensé être unique et surtout basé sur l'id. alors que si on regarde bien le slug n'as rien a voir avec aucun des champs. pourtant il es bien relié au champ id de ma table reservation.

Voici mon code:


Entity:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
 
namespace App\Entity;
 
 
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
 
 
 
/**
 * @ORM\Entity(repositoryClass=ReservationRepository::class)
 * 
 */
class Reservation
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;
 
    /**
     * @ORM\Column(type="date")
     * 
     */
    private $start;
 
    /**
     * @ORM\Column(type="date")
     * 
     */
    private $end;
 
    /**
     * @ORM\ManyToOne(targetEntity=User::class, inversedBy="reservation")
     */
    private $user;
 
    /**
     * @ORM\OneToOne(targetEntity=Room::class, cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $room;
 
    /**
     * @Gedmo\Slug(fields={"id"})
     * @ORM\Column(length=128, unique=true)
     */
    private $slug;
 
 
 
 
    public function getId(): ?int
    {
        return $this->id;
    }
 
    public function getStart(): ?\DateTimeInterface
    {
        return $this->start;
    }
 
    public function setStart(\DateTimeInterface $start): self
    {
        $this->start = $start;
 
        return $this;
    }
 
    public function getEnd(): ?\DateTimeInterface
    {
        return $this->end;
    }
 
    public function setEnd(\DateTimeInterface $end): self
    {
        $this->end = $end;
 
        return $this;
    }
 
    public function getUser(): ?User
    {
        return $this->user;
    }
 
    public function setUser(?User $user): self
    {
        $this->user = $user;
 
        return $this;
    }
 
    public function getRoom(): ?Room
    {
        return $this->room;
    }
 
    public function setRoom(Room $room): self
    {
        $this->room = $room;
 
        return $this;
    }
 
    public function getSlug(): ?string
    {
        return $this->slug;
    }
 
 
}
Controller:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
<?php
 
namespace App\Controller;
 
use App\Entity\Reservation;
use App\Form\ReservationType;
use App\BookingService\BookingService;
 
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 
 
class ReservationController extends AbstractController
{
    /**
     * @Route("/reservation", name="reservation")
     */
    public function booking(Request $request): Response
    {
        //Je créé une instance de Reservation()
        $reservation = new Reservation();
        $bookingService = new BookingService(Reservation::class, $this->container->get('doctrine'));
 
 
 
 
        //Je créé un formulaire
        $form = $this->createForm(ReservationType::class, $reservation);
 
        //J'analyse les données du formulaire
        $form->handleRequest($request);
 
        //Je vérifie si tout les champs sont soumis et valide
        if ($form->isSubmitted() && $form->isValid()) {
 
            $bookingService->book($reservation->getRoom(), $this->getUser(), $reservation->getStart(), $reservation->getEnd());
 
        }
 
 
 
        return $this->render('reservation/index.html.twig', [
            'form' => $form->createView(),
            //'user' => $this->getUser()
        ]);
    }
}
La fonction Book de la classe BookingService:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function book($room, $user, \DateTime $start, \DateTime $end)
    {
 
        if ($this->isAvailableForPeriod($room, $start, $end)) {
            $entity = new $this->entity();
            $entity->setStart($start);
            $entity->setEnd($end);
            $entity->setRoom($room);
            $entity->setUser($user);
 
 
            $manager = $this->doctrine->getManager();
            $manager->persist($entity);
            $manager->flush();
 
            return $entity;
        }
 
        return false;
    }
Ma bdd:
Nom : bdd.png
Affichages : 285
Taille : 26,7 Ko

Si vous avez besoin de plus de clarté concernant mon problème je vous en fournirai.

Merci pour votre aide a tous!