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 :

Relation entre deux tables - Formulaire clé étrangère champs type texte


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 28
    Points : 23
    Points
    23
    Par défaut Relation entre deux tables - Formulaire clé étrangère champs type texte
    Bonsoir,

    J'ai encore une fois un problème de formulaire, de liste déroulante et de clé étrangère. Je m'explique :

    J'ai un formulaire d'inscription, via le plugin sfForkedDoctrineApplyPlugin, que j'ai étendu via une table "Profil". Cette table contient un ensemble de champs, et 3 clés étrangères, prenons la clé sports_id se référent à la table Sports, par exemple.

    Voici mon schéma.yml:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    Profils:
      inheritance:
        type: column_aggregation
        extends: sfGuardUserProfile
      actAs: [ Timestampable, SoftDelete ]
      columns:
        id:
          type: integer
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        birthday:
          type: date(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        codepostal:
          type: integer
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        adresse:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        ville:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        departements_id:
          type: integer
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        nationalite:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        sports_id:
          type: integer
          fixed: false
          unsigned: false
          primary: false
          notnull: true
        fonctions_id:
          type: integer
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Departements:
          local: departements_id
          foreign: id
          type: one
        Sports:
          local: sports_id
          foreign: id
          type: one
    ....
     
     
     
     
    Sports:
      actAs: [ Timestampable, SoftDelete ]
      tableName: sports
      columns:
        id:
          type: integer
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        created_at:
          type: timestamp(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        updated_at:
          type: timestamp(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Profils:
          local: id
          foreign: sports_id
          type: many

    Lorsque j'affiche le formulaire, cette fois-ci, le champ sports_id n'est pas une liste déroulante mais un champs de saisie de texte. J'ai effectué quelques tests, en m'inscrivant, en entrant dans ce champ l'id d'un des sports (1 par exemple), cela fonctionne parfaitement.

    Cependant, c'est pas idéal de demander à l'utilisateur de taper un chiffre comme ça, j'ai donc personnaliser le widget pour mettre une liste déroulante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $this->widgetSchema['sports_id'] = new sfWidgetFormChoice(array(
                  'choices' => Sports::getSportsId(),
                  'multiple' => false,
                  'expanded' => false,
          ));
    La fonction getSportsId() associée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static function getSportsId()
        {
            $q = Doctrine_Query::create()
            ->select('s.id')
            ->from('Sports s');
     
            return $q->execute();
        }

    Le nom du sport étant stocké dans la colonne "name", ma liste déroulante affiche bien le nom du sport, cependant, lorsque je soumet le formulaire j'ai l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`monagentgdev`.`sf_guard_user_profile`, CONSTRAINT `sf_guard_user_profile_sports_id_sports_id` FOREIGN KEY (`sports_id`) REFERENCES `sports` (`id`))
    Une idée de comment résoudre cela, je m'arrache un peu les cheveux, je ne vois pas par où je pourrais résoudre ce problème ...
    Comment faire pour que Symfony repère cette clé étrangère et mette automatiquement une liste déroulante ?

    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Il semblerait que la relation entre mes deux tables ne soit pas correcte, ceci expliquant pourquoi la clé étrangère n'est pas représenté par une liste déroulante ... mais pourquoi ?

    Dans mon schema.yml, dois-je faire la relation vers ma table "Profil' plutôt que sfGuardUserProfile ?

    Cela pourrait provenir de "l'inheritance" ?

  3. #3
    Membre éprouvé 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
    Points : 933
    Points
    933
    Par défaut
    Si c'est la table Profil qui a la clé étrangère vers Sport, c'est avec cette table qu'il faut établir la relation, surtout pas avec sfGuardUserProfile.

    En outre, la relation ne doit être déclarée dans le .yml que d'un seul côté, pas des deux. Par convention (et parce que c'est plus simple avec les valeurs par défaut), on la déclare généralement dans la table qui héberge la clé étrangère.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Merci, j'ai toujours déclaré deux deux côtés, mais je prends note et je vais adapter mon schema.yml ... Et pour le moment mes recherches me mène à la conclusion suivante:

    La gestion automatique des clés étrangère par Symfony ne fonctionne pas avec les tables "inheritances".

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