[Symfony2] Problème BDD - Delete/remove

Eléphanteau du PHP | 25 Messages

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.

Eléphant du PHP | 127 Messages

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

ViPHP
ViPHP | 5462 Messages

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

Eléphanteau du PHP | 25 Messages

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.