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 :

Clés étrangères avec Doctrine


Sujet :

ORM PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Clés étrangères avec Doctrine
    Salut à tous,

    Je découvre Symfony et son outil Doctrine. Je désire réaliser un site où des news s'afficheront en page d'accueil, et j'aimerais que ces news soient affectées à l'auteur de cette news qui sera un membre du site.

    J'aimerais donc qu'à l'insertion dans la base de données, user_id de la table news soit égal à id de la table membre. Sauf que quand je crée mes données de test, cela me remplit la colonne avec des 0...

    Voici le code de schema.yml (~/projet/config/doctrine) :
    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
    Article:
      actAs: { Timestampable: ~ }
      columns:
        id: { type: integer(8), unsigned: true, primary: true, autoincrement: true }
        user_id: { type: integer(8), unsigned: true, notnull: true }
        title: { type: string(), notnull: true }
        text: { type: string(), notnull: true }
        is_online: { type: integer(1), default: '0', notnull: true }
      relations:
        User: { local: user_id, foreign: id, type: many }
     
    User:
      actAs: { Timestampable: ~ }
      columns:
        id: { type: integer(8), unsigned: true, primary: true, autoincrement: true }
        pseudo: { type: string(50), notnull: true }
        password: { type: string(50), notnull: true }
        name: { type: string(50), notnull: true }
        firstname: { type: string(50), notnull: true }
        birthday: { type: date(25), notnull: false }
        location: { type: string(50), notnull: false }
        avatar: { type: string(), notnull: false }
    Et le code de mon fixture (~/projet/data/fixtures) :
    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
    User:
      tsvtsv:
        pseudo: tsvtsv
        password: tsvtsv__
        name: TSV
        firstname: Tsv
        birthday: '1980-01-01'
        location: Caen, France
     
    Article:
      article1:
        user_id: tsvtsv
        title: Bienvenue sur le site de Tsvtsv
        text: Et oui, bienvenue !
        is_online: 1
    Je n'ai plus d'idée, après avoir pas mal changé les relations dans mon fichier schema.yml... Tout ça pour avoir :
    id pseudo password name firstname birthday location avatar created_at updated_at
    1 tsvtsv tsvtsv__ TSV Tsv 1980-01-01 Caen, France NULL 2010-08-18 14:04:48 2010-08-18 14:04:48

    id user_id title text is_online created_at updated_at
    1 0 Bienvenue sur le site de Tsvtsv Et oui, bienvenue ! 1 2010-08-18 14:04:48 2010-08-18 14:04:48
    Enfin voilà, j'espère que vous pourrez m'aider !
    Tsvtsv

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Essaies comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Article:
      article1:
        User: tsvtsv
        title: Bienvenue sur le site de Tsvtsv
        text: Et oui, bienvenue !
        is_online: 1

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci spike2, ton astuce m'a permis de faire fonctionner la chose !

    J'ai aussi modifié mon schema.yml pour que les relations soient correctes :
    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
    Article:
      actAs: { Timestampable: ~ }
      columns:
        id: { type: integer(8), unsigned: true, primary: true, autoincrement: true }
        user_id: { type: integer(8), unsigned: true, notnull: true }
        title: { type: string(), notnull: true }
        text: { type: string(), notnull: true }
        is_online: { type: integer(1), default: '0', notnull: true }
      relations:
        User: { local: user_id, foreign: id, type: one }
     
    User:
      actAs: { Timestampable: ~ }
      columns:
        id: { type: integer(8), unsigned: true, primary: true, autoincrement: true, notnull: true }
        pseudo: { type: string(50), notnull: true }
        password: { type: string(50), notnull: true }
        name: { type: string(50), notnull: true }
        firstname: { type: string(50), notnull: true }
        birthday: { type: date(25), notnull: false }
        location: { type: string(50), notnull: false }
        avatar: { type: string(), notnull: false }
      relations:
        Article: { local: id, foreign: user_id, type: many, foreignAlias: Articles }

  4. #4
    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
    Reprise de ton schéma, pour éviter tous problèmes dans les relation, on ne les définis que d'un côté en utilisant des foreign pour paramétrer l'autre côté. Et en général, on définit du côté n de la relation


    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
     
    Article:
      actAs: { Timestampable: ~ }
      columns:
        user_id: { type: integer(8), unsigned: true, notnull: true }
        title: { type: string(), notnull: true }
        text: { type: string(), notnull: true }
        is_online: { type: integer(1), default: '0', notnull: true }
      relations:
        User: 
          local: user_id
          foreign: id
          foreignAlias: Articles
     
    User:
      actAs: { Timestampable: ~ }
      columns:
        pseudo: { type: string(50), notnull: true }
        password: { type: string(50), notnull: true }
        name: { type: string(50), notnull: true }
        firstname: { type: string(50), notnull: true }
        birthday: { type: date(25), notnull: false }
        location: { type: string(50), notnull: false }
        avatar: { type: string(), notnull: false }
    Dans ton cas, la relation entre article et user était, soit ->getUser(), logique, soit ->getArticles() (le foreignAlias de la relation article de la table users) et là, c'est moins compréhensible...

    Maintenant, plus de difficultés. tu récupères le user d'un article pas ->getUser() et les articles d'un user par ->getArticles() (au pluriel pour avertir de l'arrivée d'une doctrine_collection.

    Dernière chose, je pense que tu aurais intérêt à regarder de près les plugins suivants :
    • sfDoctrineGuardPlugin pour ce qui est de la gestion des utilisateurs (connexion, déconnexion, droits).
    • sfForkedDoctrineApplyPlugin pour ce qui est de la gestion des créations des utilisateurs, des champs complémentaires, de la vérification par email des comptes emal...
    • apostrophePlugin pour ce qui est de la gestion des articles (quoique, je ne suis pas sur qu'il colle a tes besoins).
    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 !

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

Discussions similaires

  1. [2.x] gestion de clefs étrangère avec doctrine en annotation
    Par cuscodkr dans le forum Symfony
    Réponses: 2
    Dernier message: 25/10/2014, 01h32
  2. Clés étrangères avec Foreign Key
    Par CeroGrimm dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/05/2008, 14h03
  3. [MySQL] Clés étrangères avec PHP et MySQL
    Par HWICE dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/02/2008, 19h26
  4. [phpMyAdmin] Lier les tables (clés étrangères) avec phpMyAdmin
    Par tarik2a dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 23/05/2007, 18h28
  5. Réponses: 2
    Dernier message: 31/05/2006, 17h52

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