1 pièce(s) jointe(s)
Entrée de date dans la bdd avec Symfony
Bonjour à tous. :D
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:
Citation:
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:
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:
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:
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:
Pièce jointe 602344
Si vous avez besoin de plus de clarté concernant mon problème je vous en fournirai.
Merci pour votre aide a tous!