Suppresion d'un article avec une jointure

Par Elya, il y a 8 ans


Bonjour,

Sur le site que je crée, je voudrais que les utilisateurs puissent créer des articles, tous fonctionne correctement (Création, Edition) . Cependant j'ai un probléme lors de la suppresion du post, impossible de mettre la base de données a jour.

Mon Code

Entity/User

<?php namespace AppBundle\Entity; use Symfony\Component\Validator\Constraints as Assert; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use AppBundle\Helpers\UserRole; /** * @ORM\Entity * @ORM\Table(name="utilisateur") * @UniqueEntity(fields={"email"}, message="Ce mail est déja enregistrer", groups={"create"}) * @Assert\GroupSequence({"User", "create"}) */ class User { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(type="string", length=45) * @Assert\NotBlank(groups={"create"}, message="Le nom ne doit pas être vide") */ private $nom; /** * @ORM\Column(type="string", length=45) * @Assert\NotBlank(groups={"create"}, message="Le prenom ne doit pas être vide") */ private $prenom; /** * @ORM\Column(type="string", length=100, unique=true) * @Assert\NotBlank(groups={"create"}, message="Le mail ne doit pas être vide") */ private $email; /** * @ORM\Column(type="text") * @Assert\NotBlank(groups={"create"}, message="Le mot de passe ne doit pas être vide") * @Assert\NotNull() */ private $password; /** * @ORM\Column(type="integer") */ private $type; /** * @ORM\OneToMany(targetEntity="AppBundle\Entity\Post", mappedBy="author") */ private $postAuthored; // GETTER public function getId() { return $this->id; } public function getNom() { return $this->nom; } public function getPrenom() { return $this->prenom; } public function getEmail() { return $this->email; } public function getPassword() { return $this->password; } public function getType() { return $this->type; } public function getAuthoredPost() { return $this->postAuthored; } // SETTER public function setNom(string $nom) { $this->nom = $nom; } public function setPrenom(string $prenom) { $this->prenom = $prenom; } public function setEmail(string $email) { $this->email = $email; } public function setPassword(string $password) { $this->password = $password; } public function setType(int $type) { $this->type = $type; } // Method public function hashPassword() { $this->password = password_hash($this->password, PASSWORD_DEFAULT); } public function verifyPassword(string $pPassword) : bool { return password_verify($pPassword, $this->password); } public function getFullName() { return ucfirst($this->prenom) . ' ' . strtoupper($this->nom); } }

Entity/Post

<?php namespace AppBundle\Entity; use AppBundle\Entity\User; use Symfony\Component\Validator\Constraints as Assert; use Doctrine\ORM\Mapping as ORM; use Michelf\Markdown; /** * @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository") * @ORM\Table(name="post") */ class Post { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(type="string", length=100) * @Assert\NotBlank() * @Assert\Length(min="5", max="100", maxMessage="Il y a trop de caractères", minMessage="Il doit y avoir au moins 5 caractères") */ private $title; /** * @ORM\Column(type="text") * @Assert\NotBlank(message="Vous devez saisire du texte") */ private $content; /** * @ORM\Column(type="boolean") */ private $valide; /** * @ORM\Column(type="datetime", name="posted_at") */ private $postedAt; /** * @ORM\Column(type="datetime", name="updated_at", nullable=true) */ private $updatedAt; /** * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", cascade={"persist", "remove"}, inversedBy="postAuthored") * @ORM\JoinColumn(nullable=false, onDelete="CASCADE") */ private $author; /** * GETTER */ public function getId() : int { return $this->id; } public function getTitle() : ?string { return $this->title; } public function getContent() : ?string { return $this->content; } public function getAuthor() : User { return $this->author; } public function getValide() : bool { return $this->valide; } public function getPostedAt() { return $this->postedAt; } public function getUpdatedAt() { return $this->updatedAt; } /** * SETTER */ public function setTitle(string $title) { $this->title = $title; } public function setContent(string $content) { $this->content = $content; } public function setAuthor(?User $author) { $this->author = $author; } public function setValide(bool $valide) { $this->valide = $valide; } public function setUpdatedAt($updatedAt) { $this->updatedAt = $updatedAt; } public function setPostedAt($postedAt) { $this->postedAt = $postedAt; } // METHOD public function getMarkdownContent() { return Markdown::defaultTransform($this->content); } }

La fonction de suppression (Controller/MemberController)

public function RemovePostAction(Request $request, int $id) { $this->updateUserSession(); $user = $this->userAuthenticate(RoleUser::Redacteur); $em = $this->getDoctrine()->getManager(); $post = $em->getRepository(Post::class)->findOneById($id); if(is_null($user) == true ||is_null($post) ) { return $this->redirectToRoute('error_deny'); } /* dump($user->getAuthoredPost()->toArray()); */ $user->getAuthoredPost()->removeElement($post); /* Ici le post est bien supprimer */ /* dump($user->getAuthoredPost()->toArray()); */ /* Si je met cette ligne elle supprime mon utilisateur et les post (puisqu on supprime en cascade) */ /* $em->remove($post); */ $em->flush(); /* Mais dans la base de données le post reste. */ throw new \Exception('Help !'); /* return $this->redirectToRoute('member_control_post'); */ }

Ce que j'obtiens

Pour faire simple si je fait :
$em->remove($post);
Cela supprime le post mais l'utilisateur qui lui est lier en temps qu'auteur.

Et :
$user->getAuthoredPost()->removeElement($post);
Supprime correctement le post mais dans la mémoir sur serveur php, impossible de mettre a jour la base de données :/

Je vous remercie pour votre aide.

1 réponse

Uneo7, il y a 8 ans

J'ai bien du mal à comprendre ton problème. De plus je ne comprend pas vraiment ton code. Si tu récupère le post pourquoi cherche tu à le retirer depuis l'utilisateur ?

Le code suivant devrais marcher correctement :

public function RemovePostAction(Request $request, int $id) { $this->updateUserSession(); $user = $this->userAuthenticate(RoleUser::Redacteur); $em = $this->getDoctrine()->getManager(); $post = $em->getRepository(Post::class)->findOneById($id); if(!$post instanceof Post) || $post->getAuthor() != $this->getUser()) { return $this->redirectToRoute('error_deny'); } $em->remove($post); $em->flush(); return $this->redirectToRoute('member_control_post'); }

Autre chose étrange pourquoi fait tu un remove en cascade sur ton post ? Tu cherche à retirer l'utilisateur quand il delete un post ?