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 :

Problème table de jointure backend


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 22
    Par défaut Problème table de jointure backend
    Bonjour,

    Je suis confronté à un problème lié au backend (admin generator).
    A priori, j'ai une relation 1-n de chaque côté de la table de jointure (AuteurHasBd).

    Mon schema.yml ressemble à cela :
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    Auteur:
      connection: doctrine
      tableName: auteur
      actAs:
        Timestampable: ~
      columns:
        id_auteur:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nom_auteur:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        AuteurHasBd:
          local: id_auteur
          foreign: id_auteur_fk
          type: many
    AuteurHasBd:
      connection: doctrine
      tableName: auteur_has_bd
      actAs:
        Timestampable: ~
      columns:
        id_auteur_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        id_bd_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        id_serie_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
      relations:
        Auteur:
          local: id_auteur_fk
          foreign: id_auteur
          type: one
        Bd:
          local: id_bd_fk
          foreign: id_bd
          type: one
        Bd_3:
          class: Bd
          local: id_serie_fk
          foreign: id_serie_fk
          type: one
    Bd:
      connection: doctrine
      tableName: bd
      actAs:
        Timestampable: ~
      columns:
        id_bd:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        id_serie_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          autoincrement: false
        libelle_bd:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        synopsis:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        date_creation:
          type: date(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        miniature:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        nb_vues:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        nb_consultation_inactif:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        nb_cases_total:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        is_active:
          type: integer(1)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        Serie:
          local: id_serie_fk
          foreign: id_serie
          type: one
        AuteurHasBd:
          local: id_bd
          foreign: id_bd_fk
          type: many
        AuteurHasBd_3:
          class: AuteurHasBd
          local: id_serie_fk
          foreign: id_serie_fk
          type: many
        UtilisateurHasBd:
          local: id_bd
          foreign: id_bd_fk
          type: many
        UtilisateurHasBd_3:
          class: UtilisateurHasBd
          local: id_serie_fk
          foreign: id_serie_fk
          type: many
    Dans le backend, je voudrais pouvoir, lorsque que je crée une BD lui attribuer un ou plusieurs auteurs (que je choisis parmi la liste des auteurs déjà présents ou que je crée).

    Je me suis donc renseigné sur les formulaires imbriqués avec Symfony, mais je ne vois pas comment faire cela...

    Auriez-vous une idée ?

    Merci, d'avance.

  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
    Tu as donc une relation n-n entre Auteur et Bd. C'est cette relation n-n qu'il faut déclarer dans ton schema.yml plutôt que les deux relations 1-n de part et d'autre de la table d'association :

    Doctrine : relations n-n en YAML

    Dès lors, si tu déclares cela dans Auteur avec comme nom de relation Bds, tu pourras utiliser $form->embedRelation('Bds') dans ton formulaire Auteur (et récriproquement).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 22
    Par défaut
    Merci d'avoir pris la peine de me répondre.

    Néanmoins, je ne suis pas sur d'avoir bien compris. Cela donnerait quelque chose comme cela ?

    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
    118
    119
    120
    121
    122
    Auteur:
      connection: doctrine
      tableName: auteur
      actAs:
        Timestampable: ~
      columns:
        id_auteur:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nom_auteur:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        Bds:
          foreignAlias: Auteurs
          class: Bd
          refClass: AuteurHasBd
     
    Bd:
      connection: doctrine
      tableName: bd
      actAs:
        Timestampable: ~
      columns:
        id_bd:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        id_serie_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          autoincrement: false
        libelle_bd:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        synopsis:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        date_creation:
          type: date(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        miniature:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        nb_vues:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        nb_consultation_inactif:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        is_active:
          type: integer(1)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
     
    AuteurHasBd:
      connection: doctrine
      tableName: auteur_has_bd
      actAs:
        Timestampable: ~
      columns:
        id_auteur_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        id_bd_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        id_serie_fk:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
      relations:
        Bd:
          foreignAlias: AuteurHasBd
        Auteur:
          foreignAlias: AuteurHasBd

  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
    Ca ressemble à ça à quelques détails près. Le plus important est que ta table AuteurHasBd a 3 clés étrangères et non deux comme je le croyais. Je n'ai pas essayé d'utiliser les YAML de Doctrine dans le cas d'une table d'association à 3 clés donc... faut voir.

    Cela dit, tel que je comprends ton schéma, cette table n'a pas besoin de 3 clés, non ? Un auteur a 1-n bds, une bédé a 1-n auteurs, chaque bd peut éventuellement faire partie d'une série. On aurait donc une relation n-n auteurs <-> bds et une relation 1-n bd <-> série.

    Si c'est bien le cas, en corrigeant le schéma et en simplifiant le tout grâce aux convections Doctrine, ça donne quelque chose du type :
    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
     
    Auteur:
      actAs:
        Timestampable: ~
      columns:
        id:
          type: integer
          primary: true
          autoincrement: true
        nom_auteur:
          type: string(45)
      relations:
        Bds:
          foreignAlias: Auteurs
          class: Bd
          refClass: AuteurHasBd
     
    Bd:
      actAs:
        Timestampable: ~
      columns:
        id:
          type: integer
          primary: true
          autoincrement: true
        serie_id:
          type: integer
        libelle_bd:
          type: string(45)
        synopsis:
          type: string()
        date_creation:
          type: date(25)
        miniature:
          type: string(45)
        nb_vues:
          type: integer(4)
        nb_consultation_inactif:
          type: integer(4)
        is_active:
          type: boolean
      relations:
        Serie:
          foreignAlias: Bds
     
    Serie:
      actAs:
        Timestampable: ~
      columns:
        id:
          type: integer
          primary: true
          autoincrement: true
     
    AuteurHasBd:
      actAs:
        Timestampable: ~
      columns:
        auteur_id:
          type: integer
          primary: true
        bd_id:
          type: integer
          primary: true
      relations:
        Bd:
          foreignAlias: AuteurHasBd
        Auteur:
          foreignAlias: AuteurHasBd
    (!non testé!)

    Les conventions utilisées pour alléger le fichier et faciliter la lecture sont :

    columns:
    - on utilise les valeurs par défaut implicites (autoincrement false, etc....)
    - table avec une clé primaire unique : la colonne s'appelle 'id'
    - table avec une clé étrangère vers la table MaTable : la colonne s'appelle 'ma_table_id'

    relations: (relations directes telles que la relation Bd <-> Serie)
    - nom de la relation = nom de la table visée
    - par défaut, si la table visée s'appelle MaTable, la colonne qui sera utilisée par Doctrine sera la colonne ma_table_id

    NB : par défaut, les fk sont en mode 'on delete: restrict' et 'on update: restrict'. Si tu veux utiliser des cascades, n'oublie pas de le signaler dans ton schéma.

Discussions similaires

  1. [1.x] Backend : afficher formulaire table de jointure
    Par nims dans le forum Symfony
    Réponses: 2
    Dernier message: 06/04/2009, 19h18
  2. [table de jointure] problème 3201 lors d'enregistrement
    Par Heidie dans le forum Modélisation
    Réponses: 1
    Dernier message: 04/01/2009, 11h57
  3. 3 tables 2 jointures 1 problème
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/09/2008, 14h54
  4. Réponses: 5
    Dernier message: 11/12/2007, 14h44
  5. Réponses: 4
    Dernier message: 29/06/2007, 16h08

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