[Symfony2] Problème BDD - Delete/remove

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Symfony2] Problème BDD - Delete/remove

Re: [Symfony2] Problème BDD - Delete/remove

par YoshV » 10 mai 2012, 16:24

Le problème était bien le On_Delete Cascade. du coup ça ma permit d’alléger mon code grandement.

Pour stealth35: Comme je l'ai dis, j'ai éssayé différentes méthodes. certaines plus optimisé que d'autre.

Re: [Symfony2] Problème BDD - Delete/remove

par stealth35 » 27 avr. 2012, 16:21

si c'est pour rendre ce style de code, c'est pas la peine de faire du Symfony, j'ose même pas imagine le reste

Re: [Symfony2] Problème BDD - Delete/remove

par nhachet » 26 avr. 2012, 23:25

A la lecture de l'erreur, il semblerait que tu aies une table "detail_avoir" qui référence la clef primaire de ta table "eleve_has_livre".
Tu as 3 solutions :
- supprimer "à la main" les enregistrements de la table "eleve_has_livre"
- déclarer un "DELETE CASCADE" en MySQL
- déclarer une relation "DELETE CASCADE" via les annotations Doctrine
@ORM\JoinColumn(name="father_id", referencedColumnName="id", onDelete="CASCADE")
Je te laisse te renseigner sur les 2 dernières solutions (je te conseille la dernière qui permet une meilleure portabilité du code).
Plus d'infos : http://stackoverflow.com/questions/6328 ... -doctrine2

[Symfony2] Problème BDD - Delete/remove

par YoshV » 26 avr. 2012, 17:35

Bonjour,

Me voici devant un problème qui me tape la tête sérieusement. (BDD toute pourrie j'ai l'impression)

Je dois purger ma BDD. Pour cela j'utilise soit remove():
$connect = $this->getDoctrine()->getEntityManager();
foreach($objEleveHasLivre as $case => $livre)
{
           $connect->remove($objEleveHasLivre[$case]);
}
Je suis sur que mon objet soit remplis car je l'utilise entre temps et même juste avant le remove.

J'ai donc éssayé en éssayant le create Query que je met dans le repository:

mon repository:
  public function PurgeEleveHasLivre($ideleve)
  {
      $db=$this->_em->getConnection();
      $req="DELETE FROM eleve_has_livre WHERE eleve_ideleve=$ideleve AND statut_idstatut=6";
      $prep=$db->prepare($req);
      $param=array();
      $prep->execute($param);

      $query=$this->getEntityManager()->createQuery("SELECT b.idlivre FROM LGBBourseLivresBundle:EleveHasLivre a, LGBBourseLivresBundle:Livre b, LGBBourseLivresBundle:Statut c WHERE a.eleveIdeleve = $ideleve AND (a.statutstatut = 6 OR a.statutstatut = 7) AND b.idlivre = a.livreIdlivre AND b.nonRepris = 1 AND a.statutstatut = c.idstatut");
      $ListeLivreEleveNonRepris = $query->getResult();

      $NbLivre = count($ListeLivreEleveNonRepris);

      for($cpt=0; $cpt<$NbLivre; $cpt++)
      {
        // Supprimer les livre non repris //
        $db = $this->_em->getConnection();
        $query = "DELETE FROM eleve_has_livre WHERE eleve_ideleve = $ideleve AND livre_idlivre = ".$ListeLivreEleveNonRepris[0]['idlivre'];
        $stmt = $db->prepare($query);
        $params = array();
        $stmt->execute($params);
      }
  }
Ma ligne dans le controller:
$connect->getRepository('LGBBourseLivresBundle:EleveHasLivre')->PurgeEleveHasLivre($avoir->getEleveeleve()->getIdeleve());
Voici l'érreur:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`fcpe`.`detail_avoir`, CONSTRAINT `fk_detail_avoir_eleve_has_livre1` FOREIGN KEY (`eleve_has_livre_eleve_ideleve`, `eleve_has_livre_livre_idlivre`) REFERENCES `eleve_has_livre` (`eleve_ideleve)
En lisant l'érreur on dirait que l'on ne peut ni supprimer ni mettre à jour les lignes d'une clef étrangère. Celà vient de la BDD ou de mon code?

S'il vous plait aider moi :priere:

Merci d'avance.