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 :

[Doctrine] Erreur : "Unknown relation alias"


Sujet :

ORM PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 149
    Points : 80
    Points
    80
    Par défaut [Doctrine] Erreur : "Unknown relation alias"
    Bonjour,

    J'ai deux tables qui sont relation.
    La table Labelrubrique et Rubrique



    lorsque je tape mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $this->label01 = Doctrine::getTable('labelrubrique')
          ->createQuery('lr')
          ->innerJoin('lr.rubrique r')
          ->where('lr.idrubrique = ?',1)
          ->execute();
    j'ai l'erreur

    throw new Doctrine_Table_Exception('Unknown relation alias ' . $alias);

    et voici mon schema

    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
     
    Labelrubrique:
      connection: doctrine
      tableName: labelrubrique
      columns:
        idlabelrubrique:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        idrubrique:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        labelrubrique:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        lang:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        Rubrique:
          local: idrubrique
          foreign: idrubrique
          type: one
     
    Rubrique:
      connection: doctrine
      tableName: rubrique
      columns:
        idrubrique:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
      relations:
        Labelrubrique:
          local: idrubrique
          foreign: idrubrique
          type: many
    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Cette erreur t'indique que tu utilises un mauvais nom de relation dans ta requête. En effet, tu lui indiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $this->label01 = Doctrine::getTable('labelrubrique')
          ->createQuery('lr')
          ->innerJoin('lr.rubrique r')
          ->where('lr.idrubrique = ?',1)
          ->execute();
    donc d'aller chercher la relation "rubrique" dans la classe labelrubrique.
    Or, toi tu as défini la relation "Rubrique" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      relations:
        Rubrique:
    De façon générale, je te conseille très fortement d'être beaucoup plus vigilant sur tes normes de nommage. Ici, il y a plusieurs choses dangereuses :
    - tu nommes tes tables et tes objets Doctrine de façon différente (labelrubrique / Labelrubrique) ;
    - tu ne respectes pas la norme comme quoi un nouveau mot commence par une majuscule (--> LabelRubrique) ;
    - les champs Doctrine doivent respecter la convention qui prend la forme : rubrique_label_id (ce qui permet à Doctrine d'induire notamment le nom des champs requis depuis une relation).

    De plus, si ce n'est pas un impératif, je te conseille vivement d'écrire toi-même tes tables Doctrine et non de les générer depuis une base si c'est la façon dont tu as obtenu ce fichier. Sinon, tu vas perdre beaucoup en souplesse, en maintenabilité et en lisibilité (dans ton fichier, tu as beaucoup de mentions inutiles).

  3. #3
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Allez, un schéma optimisé :
    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
     
    labelrubrique:
      tableName: labelrubrique
      columns:
        rubrique_id: integer
        labelrubrique: string(45)
        lang: string(45)
      relations:
        rubrique:
           foreignAlias: labelrubriques
     
    rubrique:
      connection: doctrine
      tableName: rubrique
      columns:
        nom: string(100)
    Bon, qu'ais-je fais :
    • tous les noms sont passé en majuscule
    • toutes les valeurs par défauts sont passé à la trape
    • le soins de créer la clef est laissé à doctrine qui va créer pour chaque table un champ id (integer, auto incrémenté et primaire)
    • le nom du champs de liaison entre labelrubrique et rubrique devient rubrique_id, soit la norme de nommage pour ce type de champ, se qui permet d'alléger, beaucoup, la déclaration de la relation
    • la relation n'est défini que sur un côté, celui n en général (plus simple). Vu que les relations 1-n sont la valeur par défaut rien à préciser, vu que les champs local et foreign ont les noms par défaut, rien à préciser, il ne reste qu'à définir le nom de l'autre côté de la relation "labelrubriques" avec un "s" pour signifier qu'il y a plusieurs label pour une rubrique (et donc un doctrine_collection en retour, pas un simple objet).
    • J'ai rajouté arbitrairement un champ nom dans la table rubrique pour lui donner de la consistance


    Ta requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $this->labels101 = Doctrine_Core::getTable('labelrubrique')
                   ->findByRubriqueId(1);
    Ce que l'on appel un "Magic Finder"

    Question, pourquoi vouloir faire une liaison dans ta requêtes pour sélectioner les labelrubrique dont la rubrique est 1 alors que tu as le numéro de la rubrique stocké dans le champ rubrique_id de la table labelrubrique ?
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 149
    Points : 80
    Points
    80
    Par défaut
    Merci pour votre réactivité; bilbonec en faite le schema a été genere d'un base de donnees sql que j'avais mis en place donc l'erreur provient surement de mon manque d'experience en doctrine (c'est mon premier projet).

    Je vais refaire mon schema comme l'indique michel et comme ça régénérer la base sql via les infos de mon schema.

    Je reviens vers vous. Merci d'avance encore une fois.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    N'hésites pas à revenir. Un bon schema.yml dès le début du projet, c'est beaucoup de soucis en moins par la suite.

    Et effectivement, il vaut bien mieux partir du schema et générer la DB que l'inverse.

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par bilbonec Voir le message
    N'hésites pas à revenir. Un bon schema.yml dès le début du projet, c'est beaucoup de soucis en moins par la suite.

    Et effectivement, il vaut bien mieux partir du schéma et générer la DB que l'inverse.
    bonjour , en fait utiliser un schéma YAML est une très bonne solution proposé par symfony car nous pouvons nommer les relation avec des noms significatif , aussi un grand autre avantage lors de l'utilisation d'un SGBD , Symfony utilise le même schéma pour créer la base que se soit sur MySQL ou Oracle ou n'importe quel SGBD donc y a pas besoin d'écrire du code sql relative a chaque SGBD car il y a pas mal de différence dans les types de champs.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 149
    Points : 80
    Points
    80
    Par défaut
    Merci à tous pour vos contributions qui m'ont beaucoup aidé. Aujourd'hui mon schéma 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
     
    Labelrubrique:
     connection: doctrine
     tableName: labelrubrique
     columns:
      idlabelrubrique: { type: integer(11), primary: true, notnull: true }
      idrubrique: { type: integer(11), notnull: true }
      labelrubrique:  { type: string(255), notnull: true }
      lang:  { type: string(50), notnull: true }
     relations:
      rubrique:
       local: idrubrique
       foreign:idrubrique
       foreignAlias: labelrubrique
       foreignType: many
       type: one
     
     
    Rubrique:
     connection: doctrine
     tableName: rubrique
     columns:
      idrubrique: { type: integer(11), primary: true, notnull: true }
      nomrubrique: { type: string(255), notnull: true }
     relation:
      local: idrubrique
      foreign: idrubrique
      foreignType: one
      type: many
    Lorsque j'appelle mes deux tables j'ai plus l'erreur d'avant. Merci à tous

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Petites remarques de convention :
    - pour les id de tes relations, Doctrine supporte mieux la syntaxe suivante : rubrique_id ;
    - tant que ce n'est pas nécessaire, pas la peine de préciser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     connection: doctrine
     tableName: labelrubrique
    Cela marche aussi bien sans, et cela peut éviter quelques erreurs (plus il y a du code non nécessaire, plus il y a de risques d'erreurs).

    Have fun avec Doctrine

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/07/2011, 23h39
  2. [1.x] Unknown relation alias
    Par marwina32 dans le forum Symfony
    Réponses: 14
    Dernier message: 25/07/2011, 14h27
  3. [1.x] Unknown relation alias et innerJoin
    Par mysticpete dans le forum Symfony
    Réponses: 9
    Dernier message: 09/06/2011, 10h16
  4. [1.x] Unknown relation alias sfGuardUser
    Par YaNnZ dans le forum Symfony
    Réponses: 6
    Dernier message: 03/05/2011, 09h59
  5. Doctrine : inner join sans relations (alias)
    Par Lopimp dans le forum ORM
    Réponses: 8
    Dernier message: 26/03/2010, 02h30

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