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 :

Héritage d'objet avec relation


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Par défaut Héritage d'objet avec relation
    Bonjour,

    Voici un problème auquel les développeur de doctrine et symfony n'ont peut-être pas pensé !

    Par exemple :
    • Un objet commentaire, lié à un article.
    • Il possède soit possède une relation avec un utilisateur,
    • soit vient d'un visiteur non inscrit, donc sans 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Comment:
      actAs:
        Timestampable: ~
      columns:
        id:            { type: integer, notnull: true, primary: true, autoincrement:true }
        article_id: { type: integer, notnull: true }
        note:          { type: integer(1), notnull: true, range: [1, 5] }
      relations:
        Article:
          local: article_id
          onDelete: CASCADE
          foreign: id
          foreignAlias: Comments
        
    CommentFromUser:
      inheritance:
        type:             column_aggregation
        extends:          Comment
        keyField:         type
        keyValue:         1
      columns:
        content:  { type: string(140), notnull: true, minlength: 5 }
        user_id: { type: integer, notnull: true }
      relations:
        User:
          local: user_id
          onDelete: CASCADE
          foreign: id
          foreignAlias: Comments
        
    CommentFromVisitor:
      inheritance:
        type:             column_aggregation
        extends:          Comment
        keyField:         type
        keyValue:         2
      columns:
        content: { type: string(140), notnull: true, minlength: 5 }
        pseudo:  { type: string(140) }
    Vous voyez le problème arriver, comme j'utilise la même table, malgré l'héritage, la contrainte d'intégrité bloque l'ajout d'un commentaire d'un visiteur...

    Quel moyen d'y remédier proprement ?

    Merci !

  2. #2
    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
    Ton shéma est ingénieux. Et a priori, je dirais qu'il devrait fonctionner.

    Juste une chose, dans la relation tu utilises un champ user_id que je ne vois pas être défini.

    Après, il faudrait que je trouve du temps pour cette construction particulière, mais j'ai dans l'impression d'avoir déjà monté un tel schéma dans une application.

    Fait une introspection sur les objets base généré pour voir où est défini la relation.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Par défaut
    Salut Michel, tu as l'esprit éveillé de bonne heure !

    J'ai renommé mes champs pour simplifier mon schéma.

    user_id est à sa place.

    Cette relation est définie au bon endroit logique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    abstract class BaseCommentFromUser extends Comment
    {
        public function setUp()
        {
            parent::setUp();
            $this->hasOne('User', array(
                 'local' => 'user_id',
                 'foreign' => 'id',
                 'onDelete' => 'CASCADE'));
        }
    }
    Donc ce n'est pas au niveau programmation que cela bloque, mais finalement au niveau de MySQL, car le schéma décrit dans mon premier message créé une contrainte d'intégrité.

    J'ai l'impression du coup que mon schéma est en contradiction avec la logique des données.

  4. #4
    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
    Je crains que ton idée ne soie la bonne.

    As-tu pu vérifier au niveau de la base générée la contrainte ?

    Perso, je n'utilise jamais de contrainte d’effacement, essaye sans. Pour voir. Au cas où...

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE comment ADD CONSTRAINT comment_user_id_sf_guard_user_profile_id FOREIGN KEY (user_id) REFERENCES sf_guard_user_profile(id) ON DELETE CASCADE;
    Le code SQL me génère cette contrainte d'intégrité qui est logique, mais qui bloque un autre objet hérité d'être ajouté.

    En ne mettant pas de contrainte d'effacement, il créé carément 2 contraintes :
    • Une avec contrainte
    • Une sans contrainte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE comment ADD CONSTRAINT comment_user_id_sf_guard_user_profile_id FOREIGN KEY (user_id) REFERENCES sf_guard_user_profile(id);
    ALTER TABLE comment ADD CONSTRAINT comment_user_id_sf_guard_user_profile_id_1 FOREIGN KEY (user_id) REFERENCES sf_guard_user_profile(id) ON DELETE CASCADE;

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Par défaut
    En fait, j'imagine que la meilleure solution est la suivante :
    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
    Comment:
      actAs:
        Timestampable: ~
      columns:
        id:            { type: integer, notnull: true, primary: true, autoincrement:true }
        lang:          { type: enum, values: [en, ja, zh], default: en }
        article_id: { type: integer, notnull: true }
        note:          { type: integer(1), notnull: true, range: [1, 5] }
        pseudo:        { type: string(140) }
        content:       { type: string(140), notnull: true, minlength: 5 }
      relations:
        Article:
          local: article_id
          onDelete: CASCADE
          foreign: id
          foreignAlias: Comments
        User:
          local: user_id
          onDelete: CASCADE
          foreign: id
          foreignAlias: Comments
      options:
        collate: utf8_unicode_ci
        charset: utf8
    Donc un seul objet.

    Pour le cas des visiteurs, je créé un utilisateur bidon et j'attribut leur commentaire à ce visiteur bidon.
    Le truc un peu vexant c'est que toutes mes requêtes sur l'ensemble des utilisateurs me retournent toujours cet utilisateur bidon.

    Vous en pensez quoi ?

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

Discussions similaires

  1. [eZ Publish Community Project 2012.3] relation d'objet avec méthode de selection "parcourir"
    Par stephanegib2 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 21/06/2012, 16h28
  2. Réponses: 0
    Dernier message: 30/03/2011, 18h10
  3. Chargement d'objets avec héritage
    Par djedje38 dans le forum Hibernate
    Réponses: 1
    Dernier message: 26/03/2008, 11h50
  4. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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