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 :

Problème onDelete : CASCADE sur une table "liaison" n-n


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Par défaut Problème onDelete : CASCADE sur une table "liaison" n-n
    Bonjour,

    Alors voila, j'ai fait ceci pour créer une table liaison n-n :

    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
    Site:
       columns:
         id: { type: integer, notnull: true, primary: true, autoincrement: true }
         nom: { type: string(50), notnull: true, unique: true }
         image: { type: string(100) }
         adresse: { type: string(100), notnull: true, unique: true } 
         lien_mort: { type: boolean, notnull: true }
         description: { type: string(4000) } 	
         note: { type: float, notnull: true }
         nb_fois_note: { type: integer, notnull: true }
         nb_clic: { type: integer, notnull: true }
       relations:
          Classes: { class: Classe, local: id_site, foreign: id_classe, refClass: InterSiteClasse, onDelete: CASCADE }
     
    Classe:
       columns:
          id: { type: integer, notnull: true, primary: true, autoincrement: true  }
          nom: { type: string(30), notnull: true, unique:true }
       relations:
          SitesClasse: { class: Site, local: id_classe, foreign: id_site, refClass: InterSiteClasse, onDelete: CASCADE }
     
    InterSiteClasse:
       columns:
          id_site: { type: integer, notnull: true, primary: true }
          id_classe: { type: integer, notnull: true, primary: true }
    J'ai pourtant mis onDelete : CASCADE dans les "relations" mais quand je fais des tests, je supprime une classe référencée par exemple, il me dit cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    requête SQL:
     
    DELETE FROM `googleWow`.`classe` WHERE `classe`.`id` =1
     
    MySQL a répondu:Documentation
    #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`googleWow`.`inter_site_classe`, CONSTRAINT `inter_site_classe_id_classe_classe_id` FOREIGN KEY (`id_classe`) REFERENCES `classe` (`id`))
    Or, avec le onDelete : CASCADE, il devrait supprimer les champs qui références cette classe dans la table de liaison puis ensuite supprimer la classe correspondante dans la table Classe, non?

    Comment dois-je faire?

  2. #2
    Membre éprouvé Avatar de Vicrabb
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 66
    Par défaut
    A vrai dire, je crois que les onDelete doivent être mis dans la table de liaison et non dans les tables qui sont liées, du moins dans ton schema. C'est du moins ce que j'ai dans mon schema n:n et je n'ai pas de problème de suppression.

  3. #3
    Membre confirmé
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Par défaut
    C'est possible d'avoir un petit exemple s'il te plaît?

    Mais c'est bizarre, car pour quoi, le ONDELETE : CASCADE veut dire : "Dès que tu supprimer un enregistrement de ce champs, alors tu supprime tout les enregistrement qui y font référence"...

    Donc pour moi il faillait mettre ca dans la relation et pas dans la table de liaison =/

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    En fait, il faut mettre les relations dans la table de liaison...

    Attention au double cascade de ondelete, a ne pas risquer justement une réaction en cascade qui effacerait toute la structure...

    Ton schéma corrigé
    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
     
    Site:
       columns:
         nom: { type: string(50), notnull: true, unique: true }
         image: { type: string(100) }
         adresse: { type: string(100), notnull: true, unique: true } 
         lien_mort: { type: boolean, notnull: true }
         description: { type: string(4000) } 	
         note: { type: float, notnull: true }
         nb_fois_note: { type: integer, notnull: true }
         nb_clic: { type: integer, notnull: true }
       relations:
          Classes: { class: Classe, refClass: InterSiteClasse}
     
    Classe:
       columns:
          nom: { type: string(30), notnull: true, unique:true }
     
    InterSiteClasse:
       columns:
          id_site: { type: integer, notnull: true, primary: true }
          id_classe: { type: integer, notnull: true, primary: true }
       relations:
          Classe: {foreignAlias: InterSiteClasses, onDelete: CASCADE }
          Site: {foreignAlias: InterSiteClasses, onDelete: CASCADE }
    Il n'est que partiellement optimisé, pas le temps de gérer les majuscules intempestives.

    Fait une recherche dans la salle et tu trouveras plusieurs messages où j'explique le pourquoi des modification.

    Fait attention aux deux cascade sur les onDelete, j'ai peur qu'ils ne fasse une réaction en chaine en effaçant les enfants, puis les enfants des enfants, qui eux mêmes ont des enfants... et ainsi de suite. Je ne suis pas sur qu'une petite routine d'effacement réfléchie ne soit pas plus adaptée. Il faudrait faire des essais.

  5. #5
    Membre éprouvé Avatar de Vicrabb
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 66
    Par défaut
    Citation Envoyé par shark59 Voir le message
    C'est possible d'avoir un petit exemple s'il te plaît?

    Mais c'est bizarre, car pour quoi, le ONDELETE : CASCADE veut dire : "Dès que tu supprimer un enregistrement de ce champs, alors tu supprime tout les enregistrement qui y font référence"...

    Donc pour moi il faillait mettre ca dans la relation et pas dans la table de liaison =/
    Ca veut bien dire ce que cela veut dire: tu supprimes un enregistrement -> ses références le sont aussi si on leur adjoint le ondelete:cascade dans la relation du côté de la table de liaison (sinon en faisant le contraire, cela voudrait dire en gros qu'en supprimant une liaison, tu supprimes les deux enregistrements liés - je suis pas sûre que c'est pas la bonne explication mais c'est comme cela que je l'ai compris, ce qui fait que je fais très attention à mes onDelete ou autres).

    En fait, j'ai été imprécise quand je parlais de la table de liaison: je voulais simplement dire de mettre le on:delete dans la table de liaison après avoir mis un "relations" dans celle-ci.

  6. #6
    Membre confirmé
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2010
    Messages : 61
    Par défaut
    Quand j'execute le schéma que m'a passé Michel Rotta j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'classe_id' doesn't exist in table. Failing Query: "CREATE TABLE inter_site_classe (id_site BIGINT, id_classe BIGINT, INDEX classe_id_idx (classe_id), INDEX site_id_idx (site_id), PRIMARY KEY(id_site, id_classe)) ENGINE = INNODB". Failing Query: CREATE TABLE inter_site_classe (id_site BIGINT, id_classe BIGINT, INDEX classe_id_idx (classe_id), INDEX site_id_idx (site_id), PRIMARY KEY(id_site, id_classe)) ENGINE = INNODB
    Juste comme ca, je remarque que dans Site et Classe tu as retiré l'ID, pourquoi? Doctrine les génère automatiquement?

    EDIT:

    Après avoir bidouillé le YAML j'ai réussi à obtenu ce que je voulais, voila le code pour que ca ne mette pas l'erreur:

    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
    Site:
       columns:
          id: { type: integer, notnull: true, primary: true, autoincrement: true  }
          nom: { type: string(50), notnull: true, unique: true }
          image: { type: string(100) }
          adresse: { type: string(100), notnull: true, unique: true } 
          lien_mort: { type: boolean, notnull: true }
          description: { type: string(4000) } 	
          note: { type: float, notnull: true }
          nb_fois_note: { type: integer, notnull: true }
          nb_clic: { type: integer, notnull: true }
       relations:
          Classes: { class: Classe, refClass: InterSiteClasse}
     
     
    Classe:
       columns:
          id: { type: integer, notnull: true, primary: true, autoincrement: true  }
          nom: { type: string(30), notnull: true, unique:true }
       relations:
          Classes: { class: Site, refClass: InterSiteClasse }
     
     
    InterSiteClasse:
       columns:
          site_id: { type: integer, notnull: true, primary: true }
          classe_id: { type: integer, notnull: true, primary: true }
       relations:
          Classe: { foreignAlias: InterSitesClasses, onDelete: CASCADE }
          Site: { foreignAlias: InterSitesClasses, onDelete: CASCADE }
    Pour résumer j'ai re-précisé les colonnes "id" car j'aime pas quand je ne suis pas maitre du code ^^'
    J'ai rajouter la relation dans la table Classe
    Et quelque chose qui m'a fait halluciner, c'est que si dans ma table interSiteClasse, je mets comme nom de colonne "id_site" au lieu de "site_id" et "id_classe" au lieu de "classe_id", doctrine m'insulte lors de l'insertion avec l'erreur mise plus haut dans le post


    A part ca, le fait de mettre des majuscules rend le code non-optimisé?

  7. #7
    Membre éprouvé Avatar de Vicrabb
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 66
    Par défaut
    Citation Envoyé par shark59 Voir le message
    Pour résumer j'ai re-précisé les colonnes "id" car j'aime pas quand je ne suis pas maitre du code ^^'
    J'ai rajouter la relation dans la table Classe
    Et quelque chose qui m'a fait halluciner, c'est que si dans ma table interSiteClasse, je mets comme nom de colonne "id_site" au lieu de "site_id" et "id_classe" au lieu de "classe_id", doctrine m'insulte lors de l'insertion avec l'erreur mise plus haut dans le post
    Parce que le nom de la table se met avant le nom de la clé primaire dans une clé étrangère: imagine que tu as id_site dans ta table site, le nom dans la table SiteInterClass doit être site_id_site. Enfin, c'est recommandé de suivre cette convention: Doctrine: clés étrangères

    Pour qu'il accepte id_site, je ne saurais pas t'aider par contre.

    Et oui, Doctrine génère l'id automatiquement pour reprendre tes termes.

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

Discussions similaires

  1. Problème de filtre sur une table
    Par bilal_ini dans le forum Bases de données
    Réponses: 9
    Dernier message: 18/07/2019, 07h35
  2. Probléme de Filtre sur une Table
    Par souminet dans le forum Débuter
    Réponses: 1
    Dernier message: 28/04/2008, 11h34
  3. Probléme de concurrence sur une table
    Par D_light dans le forum Administration
    Réponses: 2
    Dernier message: 03/03/2008, 13h14
  4. Problème de pointeur sur une table de hashage
    Par nicdesf dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2006, 19h23

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