IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ORM PHP Discussion :

Enregistrements non supprimés


Sujet :

ORM PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut Enregistrements non supprimés
    Bonjour,

    J'ai un souci pour supprimer des enregistrements en base de données.

    J'ai 4 entités : Advert, Insurance, InsurancePrice et Duration. Une assurance est liée à une annonce et référence différents prix. Chaque prix est lié à une durée. Voici le schéma :

    Nom : Capture.JPG
Affichages : 134
Taille : 78,0 Ko

    Pour réaliser ceci, voici le code probant dans chacune des entités :

    Dans Advert.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /**
         * @ORM\OneToOne(targetEntity="App\Entity\Insurance", mappedBy="advert", cascade={"persist", "remove"})
         */
        private $insurance;
    Dans Insurance.php :

    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
     
    ...
        /**
         * @ORM\OneToMany(targetEntity="App\Entity\InsurancePrice", mappedBy="insurance", cascade={"persist", "remove"})
         */
        private $insurancePrices;
     
        public function __construct()
        {
            $this->insurancePrices = new ArrayCollection();
        }
    ...
        /**
         * @return Collection|InsurancePrice[]
         */
        public function getInsurancePrices(): Collection
        {
            return $this->insurancePrices;
        }
     
        public function addInsurancePrice(InsurancePrice $insurancePrice): self
        {
            if (!$this->insurancePrices->contains($insurancePrice)) {
                $this->insurancePrices[] = $insurancePrice;
                $insurancePrice->setInsurance($this);
            }
     
            return $this;
        }
     
        public function removeInsurancePrice(InsurancePrice $insurancePrice): self
        {
            if ($this->insurancePrices->contains($insurancePrice)) {
                $this->insurancePrices->removeElement($insurancePrice);
                // set the owning side to null (unless already changed)
                if ($insurancePrice->getInsurance() === $this) {
                    $insurancePrice->setInsurance(null);
                }
            }
     
            return $this;
        }
    ...
    Dans insurancePrice.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Duration")
         * @ORM\JoinColumn(nullable=false)
         */
        private $duration;
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Insurance", inversedBy="insurancePrices")
         * @ORM\JoinColumn(nullable=false)
         */
        private $insurance;
    Dans mon controller, après avoir supprimé les prix, je tente d'enregistrer mon annonce :

    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
     
    ...
            if ($formCosts->isSubmitted() && $formCosts->isValid()) { 
     
                $insurance->setIncluded($formCosts['insurance']['included']->getData());
                $insurance->setDeductible($formCosts['insurance']['deductible']->getData());
     
                $i = 0;
                $insuranceIncluded = $insurance->getIncluded();
     
                foreach ($insurancePrices as $insurancePrice) {
     
                    $price = $formCosts['insurancePrices'][$i]['price']->getData();
     
                    if ($insuranceIncluded) {
     
                        $insurance->removeInsurancePrice($insurancePrice);
     
                    }
                    else {
     
                        $insurancePrice->setPrice($price);
     
                    }
     
                    $i++;
     
                }
    ...
                $manager->persist($advert);
                $manager->flush();
    Cependant, au moment du persist(), j'obtiens cette erreur :

    An exception occurred while executing 'UPDATE insurance_price SET insurance_id = ? WHERE id = ?' with params [null, 1]:

    SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`roadtrip`.`insurance_price`, CONSTRAINT `FK_651C18DAD1E63CD1` FOREIGN KEY (`insurance_id`) REFERENCES `insurance` (`id`))
    Je ne comprends pas d'où provient l'erreur. Quelqu'un aurait une idée?

    Merci d'avance pour votre aide.
    Images attachées Images attachées  

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    J'ai modifié l'annotation de l'attribut $insurancePrices dans l'entité Insurance, et tout est maintenant ok :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         /**
         * @ORM\OneToMany(targetEntity="App\Entity\InsurancePrice", mappedBy="insurance", cascade={"persist"}, orphanRemoval=true)
         */
        private $insurancePrices;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2014, 16h46
  2. [Débutant] Enregistrement non souhaité.
    Par Monsieur Peck dans le forum Access
    Réponses: 1
    Dernier message: 11/06/2006, 14h40
  3. Réponses: 4
    Dernier message: 08/06/2006, 23h04
  4. L'enregistrement est supprimé (requete de sélection)
    Par papy_tergnier dans le forum Access
    Réponses: 1
    Dernier message: 17/05/2006, 15h14
  5. [JTabbedPane] Onglet non selectionnable et non supprimable
    Par seiryujay dans le forum Composants
    Réponses: 3
    Dernier message: 12/09/2005, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo