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 :

Schema.yml, erreur lors de la création des tables [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
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut Schema.yml, erreur lors de la création des tables
    Bonjour,

    J'utilise symfony 1.4.8 et je débute...

    Je dois créer pour une école, un site internet qui permet aux élèves de suivre des exercices sur une matière donnée et j'ai besoin d'aide car j'ai l'erreur suivante :

    SQLSTATE[HY000] : General error : 1005 can't create table mabase.#sql-8f4_f' (errno: 150). Failing Query: "ALTER TABLE exercice ADD CONSTRAINT exercice_activite_id_activite_id FORIEGN KEY (activite_id) REFERENCES activite(id) ON DELETE CASCADE".
    Ce que je cherche à faire dans mon schéma :

    L'élève choisit un objectif (par ex. Math) et une durée de cours (15 min).
    Selon ces deux paramètres, le site propose une liste d'activités (déterminée par l'admin, par ex. opération, numérotation etc... ).
    Pour une activité donnée (par ex. opération), le site impose à l'élève de choisir x exercices parmi ceux disponibles (3 exercices addition parmi les 10, 5 exercices multiplication parmi les 15 etc...).
    Le nombre d'activités et d'exercices à l'intérieur de celles-ci est fonction du temps dont dispose l'élève et est déterminé à l'avance par l'admin.

    Voici mon schema.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
    Objectif:
      columns:
        id:          { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        name:        { type: string(255), notnull: true }
        image:       { type: string(255) }
        description: { type: clob }
     
    Duration:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        period :      { type: integer, size: 2 }
      relations:
        Objectifs:
          foreignAlias: Durations
          class:        Objectif
          refClass:     Cours
          local:        duration_id
          foreign:      objectif_id
     
    Cours:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        objectif_id:  { type: integer(4), primary: true, unsigned: true }
        duration_id:  { type: integer(4), primary: true, unsigned: true }
      relations:
        Objectif:     { onDelete: CASCADE, local: objectif_id, foreign: id, foreignAlias: Courss }
        Duration:     { onDelete: CASCADE, local: duration_id, foreign: id, foreignAlias: Courss }
     
    Activite:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        name:         { type: string(255), notnull: true }
      relations:
        Courss:
          foreignAlias: Activites
          class:        Cours
          refClass:     CoursActivite
          local:        activite_id
          foreign:      cours_id
     
    Exercice:
      columns:
        id:           { type: integer(4), primary: true, autoincrement: true, unsigned: true }
        activite_id:  { type: integer(4) }
        file:         { type: string(255) }
      relations:
        Activite:     { onDelete: CASCADE, local: activite_id, foreign: id, foreignAlias: Exercices }
     
    CoursActivite:
      columns:
        cours_id:         { type: integer(4), primary: true, unsigned: true }
        activite_id:      { type: integer(4), primary: true, unsigned: true }
        nbexercices:      { type: integer(4) }
      relations:
        Cours:            { onDelete: CASCADE, local: cours_id, foreign: id, foreignAlias: CoursActivites }
        Activite:         { onDelete: CASCADE, local: activite_id, foreign: id, foreignAlias: CoursActivites }
    Je vous remercie vraiment par avance pour l'aide que vous pourrez m'apporter car je suis bien bloqué...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    Si vous pouviez me donner une idée pour créer le fichier fixtures.yml car je ne vois pas comment faire pour le modèle Cours par exemple. Merci.

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Avant de passer sur les fixatures, je proposerais de fixer (!) le schéma.

    Remarques :

    • Il vaut mieux éviter la syntaxe { } souvent un peu lourde.
    • Si aucune clef n'est créée, doctrine (l'ORM de symfony) en crée une automatiquement, (nom id; entier long, auto-incrémenté) le mieux est de lui laisser faire.
    • Il faut créer les champs de référence pour les liens, ton erreur vient du fait que les champs duration_id et objectif_id n'existent pas dans le schéma des tables.
    • Si tu utilises les noms par défaut, une relation 1-n, la plus courante, ce définit sur le côté n avec pour seul paramètre le foreignAlias
    • Pour la simplicité du code objet généré il est important de bannir les "s" de terminaisons donc jamais de pluriel et un nom comme "cours" est difficilement gérable. Par convention, un "s" signifie que la méthode objet va retourner une série d'enregistrement et pas un seul. Après comprendre getCours() et getCourss() est vite un casse tête source d'erreur...
    • Les colonnes clefs de liaison (cf "objectif_id" dans la table "cours") ne doivent pas faire partie de la clef. D'une manière général, la clef ne doit comprendre qu'un champs avec Doctrine 1.2, seul exception pour les tables de liaisons dans une relation n-n.
    • La table "cours" n'a pas de champs valeur (autre que les clefs de liaisons) les cours n'ont pas de nom ? de description ?
    • Table "Duration" je ne suis pas sur de comprendre la fonction de la propriété "period".
    • J'ai un peu de mal à dépêtrer le sac de nœuds dans les relations entre les tables "Objectif", "Duration" et "Cours". Cela pourrait ressembler à un essais de liaison n-n entre "Objectif" et "Duration" mais alors la table intermédiaire devrait logiquement s'appeler "ObjectifDuration" ou similaire, le nom "Cours" laisse entendre qu'elle est porteuses d'information qui n'y figurent pas.
    • Table "Exercice". Tu veux stocker les exercices dans un fichier séparé ? Sous quel forme ? Pourquoi pas un cblob ?
    • Oups, une deuxième tentative de relation n-n avec la table "CoursActivité" pour pivot. Ce qui ferait de la table "Cours" une table pivot (table de liaison dans une relation n-n) une table en relation avec une autre liaison n-n et une sorte de liaison n²-n² entre "Activité" et "Duration" ! Ce n'est pas possible en terme base de donnée, en tout cas, pas avec doctrine.

    Je pense qu'il faut en premier lieu fixer le schéma. Ensuite les fixatures iront seules.

    Questions complémentaires :

    • Pas d’authentification pour les élèves ? Ils peuvent refaire à l'inifini le même exercice ?
    • D'où pas de suivi de résultats non plus ?
    • Tu dis : "Le nombre d'activités et d'exercices à l'intérieur de celles-ci est fonction du temps dont dispose l'élève et est déterminé à l'avance par l'admin.". Mais où les informations sont-elle stockées ? Y a-t-il une seul possibilité de détermination ? Ou une par classe ?

    Je pense qu'il reste quelques questions à ce poser sur la structure de la base.

    J'aurais volontiers affiché un schéma rectifié mais le sac de nœuds dans les relations ne me permet pas de sortir un exemple pertinent. Pas encore .

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    Merci pour votre réponse.
    Je me sens un peu

    Alors je vais tenter d'apporter plus de précisions :

    L'élève choisit un objectif : soit math, soit français, soit anglais.
    Il choisit le temps que doit durer son cours (15, 30, 45 min, 1h : la fameuse periode de la table duration). Certains objectifs excluent la durée de 15 min par exemple.
    Un fois cela choisit, le site lui propose une séance type, composée d'un certain nombre d'activités et pour chaque activité, un certain nombre d'exercices à réaliser.
    Pour chaque activité, l'élève est libre de choisir les exercices parmi ceux liés à cette activité. Le site lui impose donc seulement le nombre d'exercices par activité.

    Exemple :
    Choix : Objectif1, 30 min.
    Activité A : 2 exercices à choisir parmi 20.
    Activité B : 1 exercices à choisir parmi 10.
    Activité C : 3 exercices à choisir parmi 5.

    Choix : Objectif2, 45 min.
    Activité A : 5 exercices à choisir parmi 20.
    Activité B : 2 exercices à choisir parmi 10.
    Activité D : 1 exercices à choisir parmi 5.
    Activité G : 1 exercices à choisir parmi 15.

    Choix : Objectif3, 15 min.
    Activité C : 3 exercices à choisir parmi 5.

    En espérant avoir été plus clair et qu'ainsi vous pourrez m'aider

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Un peu plus, mais il reste certaines zones d'ombre.

    On peut ressortir qu'il y a quatre entités dans le raisonnement :
    • On a des objectifs. Par contre sont-ils aussi généraliste que mathématique ou plus spécialisés "les fractions" ? Dans ce dernier cas il y aurait une classe d'objectifs.
    • Ensuite j'ai l'impression qu'il y a quelque chose de sous entendu mais de présent qui serait un "déroulement pédagogique" associé à une durée. Peut-ils y avoir plusieurs déroulement pédagogique d'une même durée pour un même objectif ?
    • Les activités permettent de détailler un déroulement pédagogique. Elle sont constituées d'une activité (!) et d'un nombre d’exercices précis à choisir dans une liste d’exercices possibles.
    • Enfin, les exercices, partie qui demande une réponse de l'élève. (Il la saisi comment la réponse ?)


    Questions sur les liens a établir entre ces différentes entités, les affirmations suivantes correspondent-elles à la vérité :

    • Un objectif est lié à un ou plusieurs déroulement pédagogique. Un déroulement pédagogique est lui toujours lié à un objectif unique.
    • Un déroulement pédagogique est lié à une ou plusieurs actions. Une action est toujours lié à un déroulement pédagogique unique.
    • Une action est liée à un ou plusieurs exercices. Un exercice est toujours lié à une action unique.

    Il est possible que ces affirmations soient fausse et qu'un exercice puisse être lié à plusieurs action différentes par exemple.

    Ensuite il serait bénéfique pour la compréhension de répondre aux questions complémentaires de ma précédente intervention. Suivant les réponses données, cela peut modifier la structure du schéma très sensiblement.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    En fait pour être plus précis, il s'agit de cours de sport en vidéo. Voir document joint pour les plans de cours en fonction des objectifs... Je pense que cela va vous parler.

    Pas d’authentification pour les élèves ? Ils peuvent refaire à l'inifini le même exercice ?
    Il y aura une identification de l'élève, déléguée à sfDoctrineGuardPlugin et sfDoctrineApplyPlugin. Les élèves peuvent effectivement refaire les exercices à l'infini. Il faudra qu'il puisse enregistrer la construction de sa séance (l'objectif et le temps choisi, et la liste des exercices choisis par l'élève, pour chaque activité proposée).

    Mais où les informations sont-elle stockées ? Y a-t-il une seul possibilité de détermination ? Ou une par classe ?
    Dans la BDD, sont stockés pour chaque objectif et chaque durée, les activités proposées par le professeur. Ces activités peuvent appartenir à plusieurs objectifs. Par contre les exercices appartiennent à une seule activité.

    Je suis à votre disposition pour vous apporter plus de renseignements.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Eviter les erreurs lors de l'utilisation des compo Tsocket
    Par Coussati dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/02/2006, 19h14
  2. Réponses: 1
    Dernier message: 26/05/2005, 12h24
  3. Réponses: 7
    Dernier message: 22/02/2005, 13h07
  4. message d'erreur lors de la création de la base
    Par ber_jp dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/05/2004, 12h15
  5. message d'erreur lors de la création d'une base
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/04/2004, 15h47

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