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 :

Relation entre deux tables dans schema.yml sans contrainte [Doctrine]


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 18
    Par défaut Relation entre deux tables dans schema.yml sans contrainte
    Bonjour,

    J'essaie de créer une simple relation entre deux tables qui sont city et region en sachant que la clé de jointure peut être vide (J'utilise des données du site Geonames et certaines villes situées sur de petites îles n'appartiennent pas à une région).

    Hors lorsque je crée la relation entre mes deux tables dans le schema.yml, Doctrine crée une clé étrangère mais aussi une contrainte entre les deux tables qui donne ceci dans le schema.sql généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE city ADD CONSTRAINT city_admin1_code_region_admin1_code FOREIGN KEY (admin1_code) REFERENCES region(admin1_code);
    Et cela plante lorsque j'alimente ma table des villes à cause du champ admin1_code reliant mes deux tables qui peut être vide.

    J'ai toujours la possibilité de retirer la référence à la contrainte dans le schema.sql tout en le laissant dans le schema.yml mais cela n'est pas très "propre"...

    Bref, j'ai cherché, cherché mais pas trouvé une bonne solution. Quelqu'un pourrait-il m'aider ?

    Merci d'avance !

    Nino
    PS : Pour info, j'utilise Symfony 1.4.11 et donc, sauf erreur, Doctrine 1.2

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Citation Envoyé par ninorotto Voir le message
    en sachant que la clé de jointure peut être vide
    L'as-tu spécifié dans ton schema.yml (notnull : false, ou rien du tout car notnull est réglé à false par défaut) ? Peut-on voir ton .yml ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 18
    Par défaut
    Bonjour Herode,

    oui, je l'ai spécifié et voici un extrait de mon schema.yml avec les 2 tables (j'ai juste enlevé les champs qui ne sont pas utiles dans l'analyse pour plus de clarté) :

    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
     
    Region:
      connection: doctrine
      tableName: region
      columns:
        id:
          type: integer(8)
          autoincrement: true
          primary: true
        iso:
          type: string(2)
          fixed: true
        admin1_code:
          type: string(8)
          fixed: true
        name:
          type: string()
      indexes:
        region_iso_index:
          fields: [iso]
        region_admin1_code_index:
          fields: [admin1_code]
     
    City:
      connection: doctrine
      tableName: city
      columns:
        id:
          type: integer(4)
          notnull: true
        name:
          type: string(100)
        latitude:
          type: 'decimal(10, 7)'
        longitude:
          type: 'decimal(10, 7)'
        admin1_code:
          type: string(8)
          notnull: false
      relations:
        Region: { local: admin1_code, foreign: admin1_code, class: Region }

    Merci !

    Nino

  4. #4
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Hmm, je n'ai jamais essayé de déclarer une relation sur un champ qui n'est pas une clé primaire. Je ne sais pas comment Doctrine réagit là-dessus mais comme Doctrine est un peu caractériel, je me méfierais...

    Un autre détail me turlupine : le champ qui fait le lien est déclaré string(8) fixed en haut mais string(8) en base. A moins que 'fixed' soit réglé à true par défaut - à vérifier - cela peut aussi causer des soucis à Doctrine.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 18
    Par défaut
    Effectivement, il y avait une différence entre les deux champs car par défaut, fixed est à faux. J'ai donc supprimé le fixed=true pour faire un test et cela me crée la même contrainte.

    J'ai aussi essayé de déclarer un ON UPDATE NO ACTION et un ON DELETE NO ACTION dans la relation pour qu'il crée la clé étrangère sans la contrainte mais rien à faire...

    En sachant que mes tables city et region n'évolueront pas dans le temps, elles sont utilisées en tant que tables de références et si je ne trouve pas de solution, soit :
    - je laisse la relation dans le schema.yml, mais j'enlève dans le schema.sql la contrainte. Ma relation existera donc dans le modèle et sera utilisable.
    - je ne crée pas de relations dans mon schema.yml, ce qui signifie que je ne pourrai pas utiliser la relation dans mes requêtes en DQL, ce qui semble moins pratique (à priori...).

    Si vous avez des conseils, je suis preneur, car je développe pour le plaisir et cela n'en est plus un quand on rencontre plusieurs problèmes de ce type (j'en ai d'autres en parallèle).

    D'ailleurs, l'utilisation d'un framework était censé me faire gagner du temps, c'était le cas au tout début mais je pense qu'au final, ce n'est plus le cas. Et pourtant, je lis le maximum de ressources sur le web pour essayer de faire au mieux.

    Bref...

    Nino

  6. #6
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Mon conseil serait d'utiliser la clé primaire id comme clé étrangère region_id. C'est plus orthodoxe et dans cette configuration, avec notnull = false, ça devrait marcher.

    Quand à gagner du temps avec des frameworks, ça se discute. Avec symfony, le problème que j'ai régulièrement est que sur les opérations simples et standard, une fois passée la phase d'apprentissage (longue et douloureuse), ça fait effectivement gagner du temps - mais il y a d'autres avantages non négligeables : code normalisé, propre, maintenance facilitée. Par contre, quand je tombe sur un os, ça peut très vite dériver gravement et me prendre plusieurs jours pour régler proprement une question que j'aurais torchée en une demi-journée hors framework.

    Il faut aussi voir quels sont les besoins réels. Pour une grosse application en intranet/extranet, symfony vaut sans doute le coup. Pour des projets persos ou plus modestes, il y a des frameworks bien plus légers et très satisfaisants (j'ai fait quelques essais comparatifs sur Yii récemment, par exemple, c'est intéressant). A vue de nez, je dirai que symfony demande au minimum un à deux ans à temps plein pour être correctement maitrisé. C'est un investissement à long terme - et un combat de tous les instants.

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

Discussions similaires

  1. [DEBUTANT]Problème de relation entre deux tables
    Par Yomane dans le forum Schéma
    Réponses: 2
    Dernier message: 20/10/2006, 01h30
  2. relation entre deux tables
    Par tojiji dans le forum Access
    Réponses: 6
    Dernier message: 04/07/2006, 14h44
  3. Problème de relation entre deux tables + autre chose
    Par Goth_sensei dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/03/2006, 20h49
  4. [XSD] Relation entre deux tables
    Par fd59 dans le forum Valider
    Réponses: 2
    Dernier message: 09/09/2005, 23h33
  5. Relation entre deux tables
    Par manel007 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/03/2005, 16h54

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