Symfony: Comment corriger l’erreur « Can’t create table (errno: 150) »?

Après avoir conçu le fichier schema.yml pour une application de jeux en ligne, j’ai été surpris par une erreur mysql 150 au moment quand j’ai exécuté « php symfony doctrine:build –all –and-load –no-confirmation », l’idée était de pouvoir gérer les permissions par rapport à un concours et donner à un utilisateur X les droits pour le faire, la solution la plus naturel afin de l’intégrer avec sfDoctrineGuard est de créer une table avec une relation « many to many« , voici donc ce que contenait mon fichier schma.yml pour la table concernée :

################## Questions ##################    
Concours:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true}
    name: string(250)
    ....
############ Gestion des Permissions ############    
sfGuardConcoursUser:
  columns:
    user_id: { type: integer, primary: true}
    concours_id: { type: integer, primary: true}
  relations:
    Concours: { local: concours_id, foreign: id, foreignAlias: sfGuardConcoursUserConcours, onDelete: CASCADE }
    sfGuardUser: { local: user_id, foreign: id, foreignAlias: sfGuardConcoursUsersfGuardUser, onDelete: CASCADE }

Problème

Après avoir fait un « php symfony doctrine:build –all –and-load –no-confirmation », j’ai eu droit à cette erreur:

SQLSTATE[HY000]: General error: 1005 Can’t create table ‘test.#sql-529_3dab’ (errno: 150). Failing Query: « ALTER TABLE jeux_concours ADD CONSTRAINT jeux_concours_concours_id_user_id FOREIGN KEY (concours_id) REFERENCES concours

Solution?

Et Oui c’est l’une des erreurs qui m’ont fait chier pendant une heure pour trouver d’où ça provient, pour vous faire gagner du temps, voici la recette magique ;) :

Pour mysql les relations « many to many » doivent avoir toujours le même type et la même longueur des champs clés, vous remarquez bien que le champ Concours[id] est du type integer(4), par-contre dans la table sfGuardConcoursUser il est du type integer, il n’a donc pas la même longueur et c’est à cause de cette différence que l’erreur 150 s’est produite.

La solution est très simple, il suffit de mettre integer comme type pour le champ id de la table Concours au lieu de integer(4) et Bingo!

Happy coding

Intérprétation Warda 3la Warda du Group K’lma

K'lma

Faissal Azizi, Ex-Membre du Groupe K'lma

Il faisait nuit! Allongé sur mon lit à réfléchir dans un silence brouillant de pensées, j’étais d’une humeur noirâtre et j’arrivais pas à dormir! Dans ma tête une mélodie ne cessais pas de se répéter en boucle, cette mélodie assez familière de la chanson Warda 3la Warda du groupe K’lma chanté par Faissal Azizi et Sakina, c’est d’ailleurs la chanson qui m’a encouragé à m’acheter une guitare, je me rappelle très bien le soir quand Moncif Aissaoui est venu à Rabat avec sa guitare et qu’il l’a joué avec sa guitare, c’était l’instant quand je lui ai demandé de m’acheter une! C’était ma première guitare!

Je n’ai pas pu m’empêcher de me lever de mon lit, brancher mon micro, et commencer à jouer en enregistrant avec quelques improvisations et touches personnelles , je vous laisse écouter mon essaie composé de trois pistes: arpège, décoration et solo, j’ai improvisé un petit peu au milieux de la chanson =)

Pour les Accords de l’arpège c’est :

SI – MI mineur – SOL – FA#
en annotation américaine:
B – E min – G – F#

Ordre de cordes de l’arpège

Il faut jouer les cordes dans cet ordre :

2 – 3 – 4 – 6 – 5 – 4

Voilà, bon écoute!

Écouter

Clip audio : Le lecteur Adobe Flash (version 9 ou plus) est nécessaire pour la lecture de ce clip audio. Téléchargez la dernière version ici. Vous devez aussi avoir JavaScript activé dans votre navigateur.

Téléchargement

Vous pouvez télécharger le morceau en cliquant ici