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 :

Suppresion enregistrement liaison n:n requete Doctrine


Sujet :

ORM PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut Suppresion enregistrement liaison n:n requete Doctrine
    Bonjour, j'ai une relation n:n avec une table de jointure voir schéma ci joint

    j'ai effectué l'affichage des champs de la table nomenclature dans le formulaire d'édition du modèle de la table produit.
    Maintenant je souhaite pouvoir supprimer des nomenclatures à partir de ce même formulaire pour cela j'utilise sfWidgetFormInputDelete.class.

    mais j'ai quelques soucis, j'ai besoins de conseil car je n'ai pas trouvé d'exemple pour la suppresion en relation n:n.
    Voici le code de mon action est-ce la bonne méthode?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      public function executeDeleteNomenclature(sfWebRequest $request) {
          // Je supprime le liens entre les deux tables
          $q = Doctrine_Query::create()
            ->delete('liensnomenclature a')
            ->where('a.nomenclature_idNomenclature = 2');
          $rows = $q->execute();
          // je supprime la nomenclature
          $manufacturing_file = Doctrine::getTable('manufacturingfile')->find($request->getParameter('id'));
          $manufacturing_file->delete();
     
      }
    Un autre probléme, j'ai mon url qui est de la forme suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /produit/deleteNomenclature/action?id=2
    pour que ça fonctionne je suis obligé de remplacer l'url par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /produit/2/deleteNomenclature
    mais dans ce cas la $request->getParameter('id') ne fonctionne plus.

    De plus comment puis-je passer une variable php a une requete doctrine?
    car comme ceci ça ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->where('a.nomenclature_idNomenclature = $id);
    ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->where('a.nomenclature_idNomenclature = ? ',$id);
    merci pour votre aide
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Pour la suppression, regarde dans le module sfGuard, il y a trois tables en liaison n-n (cinq en tout avec les liaisons).

    En fait ils ont dans le modèle delete: CASCADE

    Ce qui fait que si tu supprimes un enregistrement, les liaisons dans la tables de liaisons sont supprimées aussi.


    Pour le pb d'URL, cela vient probablement du fichier routing.yml, mais il faudrait pouvoir le voir pour localiser. On n'a pas déjà parlé de ça dans un autre post ?


    Pour la syntaxe du where, la deuxième est la bonne. Pour déboguer du doctrine, il faut créer un objet et ne pas faire la méthode exécuter() en fin de requête.

    Si on imprime (echo) l'objet généré, il retourne le SQL.

    Donc tu prépares ta requête sans l'exécuter, tu fais un echo de l'objet et un die derrière. La requête s'affiche avec les ? c'est normal, mais permet de voir si elle est bien formée.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    ah mince je n'ai pas modélisé ma bdd comme ça,
    tu veut dire que dans mon cas si la clé étrangère de l'id nomenclature est a delete:cascade en supprimant l'enregistrement de la table de liaison ça supprimerai l'enregistrement joint en nomenclature?

    pour le probléme d'url oui j'ai fait un autre post

    sinon pour les requêtes je suis arrivé à les faire fonctionner mais je supprime les enregistrement dans les deux tables séparément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          $record = $request->getParameter('id');
          $q = Doctrine_Query::create()
            ->delete('liensnomenclature a')
            ->where('a.nomenclature_id = ?',$record);
          $rows = $q->execute();
          $bom_file = Doctrine::getTable('nomenclature')->find($record);
          $bom_file->delete();
    donc il faut que je teste en mode cascade, et juste en supprimant le liens avec la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          $record = $request->getParameter('id');
          $q = Doctrine_Query::create()
            ->delete('liensnomenclature a')
            ->where('a.nomenclature_id = ?',$record);
          $rows = $q->execute();

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    effectivement ça marche nickel
    j'ai ajouté onDelete:cascade sur la table liensnomenclature et dans le schema.yml

    maintenant je fait juste une suppression de la nomenclature et ça supprime tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bom_file = Doctrine::getTable('nomenclature')->find($record);
          $bom_file->delete();
    merci

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

Discussions similaires

  1. Affiche nouvel enregistrement dans formulaire après requete ajout
    Par Viggen0020 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/02/2009, 12h12
  2. Réponses: 1
    Dernier message: 26/09/2006, 16h44
  3. Réponses: 9
    Dernier message: 11/05/2006, 15h31
  4. Probleme de liaison entre une requete et un objet...
    Par actibluelevrai dans le forum Access
    Réponses: 4
    Dernier message: 20/11/2005, 20h26

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