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

Symfony PHP Discussion :

clés primaire dans schema.yml


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut clés primaire dans schema.yml
    Bonjour tout le monde,

    Enfaite, je sais pas comment faire pour ecrire une clé primaire dans une table qui fait réference à une autre clé primaire d'une autre table. Et cette derniere est composé de deux champs. donc voila j'ai fais ça mais ça marche pas. Dans le fichier sql généré il prend en compte que la derniere clé étrangére (c'est à dire "network"). voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bus_id:  { type: integer, foreignTable: portal_bus, foreignReference: service, foreignReference: network, required: true, primaryKey: true, onDelete: cascade }
    avec (service,network) c'est la clé primaire de la table "portal_bus"

    y a t'il quelqu'un qui sais comment faire ?

    Cordialement,

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 117
    Points : 123
    Points
    123
    Par défaut
    Alors voila, il y a vait un exemple sur un tutoriel de Jobeet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    JobeetCategoryAffiliate:
      tableName: jobeet_category_affiliate
      columns:
        category_id:  { type: integer, primary: true }
        affiliate_id: { type: integer, primary: true }
      relations:
        JobeetCategory:  { onDelete: CASCADE, local: category_id, foreign: id }
        JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }
    Dans tes tables où il y a tes clés primaires, tu ne déclare pas tes id surtout.

    Quand tu déclare tes relations c'est comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [Nom de ta table] : { onDelete:Cascade, local : [Nom de ton Champ dans la table courante], foreign : id }
    J'espère avoir été assez clair, et avoir bien compris ta question.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Merci Malonix

    Mais enfaite, le souci que j'ai c'est que tu vois par exemple dans le code que tu m'a donné foreign: id . mon id correspond à deux clés primaire de ma table portal_bus.
    ma table portal_bus a deux clés primaire (c'est un couple qui fait l'unicité de l'objet bus), et je connais pas la structure pour les réferencés les deux dans le code que j'ai donné. Voila je sais pas si j'ai été clair ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 117
    Points : 123
    Points
    123
    Par défaut
    Euh juste si tu pouvais faire voir ton schema.yml, voir ce que tu as fait, et donc si je comprends bien, en gros : Tu as 3 tables :

    - Une table A avec une clé primaire
    - Une table B avec une clé primaire
    - Une table C avec deux clé primaire qui sont référencés par les 2 autres?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    oui voici le code:
    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
    portal_bus:
        service:      { type: integer, required: true, primaryKey: true }
        network:      { type: integer, required: true, primaryKey: true }
        env:          { type: varchar(10), required: true, foreignTable: portal_environment, foreignReference: name }
        application:  { type: varchar(32), required: true }
        iam_ref:      { type: varchar(3), required: true, foreignTable: portal_iam , foreignReference: ref }
        module:       { type: varchar(50) }
        description:  { type: varchar(255) }
        status:       { type: varchar(5), required: true }
        entity:       { type: varchar(32), required: true }
        creator:      { type: varchar(80), required: true }
        modifier:     { type: varchar(80) }
        created:      { type: timestamp, required: true }
        modified:     { type: timestamp }
        reference:    { type: varchar(32) }
        active:       { type: boolean, required: true, default: 0 }
        tags:         { type: varchar(20) , foreignTable: portal_label, foreignReference: name }
        alias:        { type: varchar(32), required: true }
        prefix:       { type: varchar(255) }
    
    
      portal_bus_label:
        bus_id:       { type: integer, foreignTable: portal_bus, references: {service, network}, required: true, primaryKey: true, onDelete: cascade }
        label_id:     { type: varchar(20), foreignTable: portal_label, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
    
    

    le probléme est la ou c'est en rouge!
    Je sais pas si tu vois ce que je veux faire ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    Je ne comprends pas la logique de ton schema, pourquoi ne pas tout simplement rajouter un attribut unique dans ta table portal_bus et t'en servir de clé dans portal_bus_label?
    Je sais pas si je suis clair

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    oui j'y est penser mais enfaite mon boss m'a dit que c'est le couple service et network qui font l'unicité de la table portal_bus. Donc c'est pour ça que je les ai mis comme clés primaires. T'aurai une idée à me suggérer pour un avoir un id et garder cette condition ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    Oui je pense avoir une idée, la même que précédement
    Tu laisses ta clé primaire binaire avec network et service dans ta première table et tu ajoutes un attribut en integer unique que tu appeles xx_id par exemple.
    Ensuite dans ta seconde table, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bus_id:       { type: integer, foreignTable: portal_bus, references: xx_id, required: true, primaryKey: true, onDelete: cascade }
    Par contre apès il faudra que tu modifies pour que le xx_id s'autoincrémente, donc ma version n'est pas exacte

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    J'ai essayé de faire ça mais ça marche pas. propel construit le fichier sql sans erreur mais quand je fais l'insert dans la base de donnée, il insert toutes mes tables sauf portal_bus_label !!!
    et dans la table portal_bus j'ai rajouté la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id:  {type: integer, required: true, primaryKey: true, autoIncrement: true, index: unique}
    Et biensur j'ai essayé sans index et sans primaryKey !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    A mon avis le autoincrement est dans la table portal_bus, pas dans la portal_bus_label. Car dans celle label, la valeur de l'id prend celle de l'id de portal_bus, c'est donc celle ci qu'il faut incrémenter afin qu'elle soit unique et qu'elle identifie bien ton portal_bus et pas un autre

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Voila finalement ce que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    portal_bus_label:
        bus_service:  { type: integer, foreignTable: portal_bus, foreignReference: service, required: true, primaryKey: true, onDelete: cascade }
        bus_network:  { type: integer, foreignTable: portal_bus, foreignReference: network, required: true, primaryKey: true, onDelete: cascade }
        label_id:     { type: varchar(20), foreignTable: portal_label, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
    et ça ne marche toujours pas quand je fais insert dans la base de donnée.
    alors j'ai pris le code sql généré, et je l'ai moi méme inséré dans ma base de donnée. la table a bien été crée. Donc, ça résoud le probléme d'une part mais je ne sais pas pourquoi propel me dit qu'il y a une erreur. Voici le code sql:
    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
    CREATE TABLE `portal_bus_label`
    (
            `bus_service` INTEGER  NOT NULL,
            `bus_network` INTEGER  NOT NULL,
            `label_id` VARCHAR(20)  NOT NULL,
            PRIMARY KEY (`bus_service`,`bus_network`,`label_id`),
            CONSTRAINT `portal_bus_label_FK_1`
                    FOREIGN KEY (`bus_service`)
                    REFERENCES `portal_bus` (`service`)
                    ON DELETE CASCADE,
            INDEX `portal_bus_label_FI_2` (`bus_network`),
            CONSTRAINT `portal_bus_label_FK_2`
                    FOREIGN KEY (`bus_network`)
                    REFERENCES `portal_bus` (`network`)
                    ON DELETE CASCADE,
            INDEX `portal_bus_label_FI_3` (`label_id`),
            CONSTRAINT `portal_bus_label_FK_3`
                    FOREIGN KEY (`label_id`)
                    REFERENCES `portal_label` (`id`)
                    ON DELETE CASCADE
    )

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    On peut avoir un aperçu de l'erreur??

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Biensur le voici :
    Quans je fait la commande php symfony propel:insert-sql il m'affiche ça:

    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
    [propel-sql-exec] Failed to execute:
    
     CREATE TABLE `portal_bus_label`
     (
     `bus_service` INTEGER  NOT NULL,
     `bus_network` INTEGER  NOT NULL,
     `label_id` VARCHAR(20)  NOT NULL,
     PRIMARY KEY (`label_id`),
     CONSTRAINT `portal_bus_label_FK_1`
     FOREIGN KEY (`label_id`)
     REFERENCES `portal_label` (`id`)
     ON DELETE CASCADE,
     INDEX `FI_foreign_key` (`bus_service`,`bus_network`),
     CONSTRAINT `my_foreign_key`
     FOREIGN KEY (`bus_service`,`bus_network`)
     REFERENCES `portal_bus` (`service`,`network`)
     ON DELETE CASCADE
     )Type=InnoDB
    [propel-sql-exec] SQLSTATE[HY000]: General error: 1005 Can't create table 'portal.portal_bus_label' (errno: 150)
    
      Some problems occurred when executing the task:
    If the exception message is not clear enough, read the output of the task for more information

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 117
    Points : 123
    Points
    123
    Par défaut
    C'est une erreur SQL et en faite cet erreur indique qu'il y a un problème avec une de tes clefs étrangères.

    Donc déja ca ne viens pas de Symfony mais des tables que tu veux crées.

    Donc voila on va reprendre du début. Si j'ai bien compris ce que tu veux :

    Tu as 3 tables: tu en as une avec une primaire et des attributs, une deuxième pareil, par contre tu souhaite que t'as troisième comporte 2 clé primaires qui font référence aux deux clés primaires des autres tables ?

    C'est bien ca?

Discussions similaires

  1. [1.x] Erreur propel-build-model dans schema.yml?
    Par charliejo dans le forum Symfony
    Réponses: 2
    Dernier message: 19/10/2009, 14h07
  2. [1.x] index=unique dans schema.yml
    Par kamdad dans le forum Symfony
    Réponses: 4
    Dernier message: 23/04/2009, 17h55
  3. clés primaire dans access 2007
    Par ChTiRiBi dans le forum Modélisation
    Réponses: 2
    Dernier message: 05/08/2008, 10h46
  4. Réponses: 4
    Dernier message: 15/01/2007, 21h51
  5. Comment avoir 2 clés primaires dans une table
    Par Guigui_ dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 18/01/2005, 08h29

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