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 :

"tuning" doctrine yml


Sujet :

ORM PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut "tuning" doctrine yml
    Bonjour,
    Et merci tout d'abord à tous les gens qui m'aident :

    voila dans une table je voudrais flager la creation et la modification d'une table :

    created_by:
    type: integer
    notnull: true
    modified_at:
    type: timestamp
    modified_by:
    type: integer
    relations:
    country:
    local: country_id
    foreign: id
    foreignAlias: countries
    account:
    local: created_by
    foreign: id
    account:
    local: modified_by
    foreign: id

    or la creation et la modification se fait par les comptes (account) et doctrine ne semble prendre en compte que la 2eme relation...

    merci encore de votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    C'est sur que si tu leur donnes le même alias ça ne va pas marcher.

  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
    Et si tu pouvais mettre ton code entre balise code, cela permettrai une meilleur lisibilité du fichier yaml

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut
    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
        
        created_at:
          type: timestamp
          notnull: true
        created_by:
          type: integer
          notnull: true
        modified_at:
          type: timestamp
        modified_by:
          type: integer
      relations:
        country:
          local: country_id
          foreign: id
          foreignAlias: countries
        account:
          local: created_by
          foreign: id
          foreignAlias: create
        account:
          local: modified_by
          foreign: id
          foreignAlias: modify
    Voilà, et cela ne me crée un index et une foreign key uniquement sur modified_by.
    Merci d'avance de vos réponses

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est parce que tu utilises deux fois le même nom de relation. Je te suggère quelque chose comme :
    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
     
    relations:
        country:
          local: country_id
          foreign: id
          foreignAlias: countries
        creationAccount:
          class: account
          local: created_by
          foreign: id
          foreignAlias: create
        modificationAccount:
          class: account
          local: modified_by
          foreign: id
          foreignAlias: modify
    Et tes foreign aliases me paraissent vraiment pas logiques à ta place je les changerai mais bon, je peux pas donner d'exemple étant donné que tu n'as pas indiqué le nom de la table en question ^^

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut
    Merci ca marche :

    Alors concernant la globalité :

    j'ai une table account (utilisateur logué) et une table merchant . La table merchant peut etre crée et modifiée par des account.
    Aussi qu'es ce qu'il ne va pas dans les noms d'index ?

    merci encore pour ton aide.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Les foreignAlias sont les noms de relations que tu vas utiliser dans ton code. Ca veut dire qu'il faut qu'ils soient explicites et clairs.

    Typiquement là on était sur ta table Merchant, donc CreationAccount et ModificationAccount sont explicites : tu vas récupérer les Account de creation ou modification lié à ton Merchant.

    Le foreignAlias, ça indique le nom utilisé pour récupérer les marchants que cet Account a créé et modifié. Si tu mets create et modify dans ton code ça te fera genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $account->getCreate();
    $account->getModify();
    Alors si toi ça peut te sembler limpide, je t'assure que moi non. Et on sait jamais ce qui va arriver à ton code source, même si pour l'instant tu es seul dessus, rien ne dit que dans le futur c'est pas quelqu'un d'autre qui le maintiendra.

    Je te suggère donc en foreignAlias de mettre "CreatedMerchants" et "ModifiedMerchants". Dans ton code ça donnera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $account->getCreatedMerchants();
    $account->getModifiedMerchants();
    Là on sait de quoi il s'agit. Enfin je trouve. Après comme toujours, c'est un conseil, tu peux en faire ce que tu veux
    Dernière modification par Invité ; 28/04/2010 à 14h26. Motif: correction faute de frappe

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut
    mais c'est un très bon conseil, je le prends avec plaisir

    Merci encore.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut
    Par contre, j'ai encore une petite question :

    j'ai 3 tables : 1 avec une clé simple (criteria), 1 avec une clé double(merchantnotation) et la 3eme dont je veux que la clé soit la clé simple + la clé double(merchantnotationcriteria) :

    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
    57
    58
    59
    60
    61
    62
    criteria:
      connection: doctrine
      tableName: criteria
      columns:
        name:
          type: string(150)
          notnull: true
     
    merchantnotation:
      connection: doctrine
      tableName: merchantnotation
      columns:
        comment:
          type: string(255)
        datenotation:
          type: timestamp
          notnull: true
        merchant_id:
          type : integer
          primary: true
        account_id:
          type : integer
          primary: true
      relations:
        merchant:
          local: merchant_id
          foreign: id
        account:
          local: account_id
          foreign: id
     
    merchantnotationcriteria:
      connection: doctrine
      tableName: merchantnotationcriteria
      columns:
        criteria_id:
          type : integer
          primary: true
        merchantcriteria_id:
          type : integer
          primary: true
        accountcriteria_id:
          type : integer
          primary: true
        comment:
          type : string(255)
        evaluation:
          type : integer(4)
      relations:
        criteria:
          local: criteria_id
          foreign: id
        merchantlistnotation:
          class: merchantnotation
          local: merchantcriteria_id
          foreign: merchant_id
          foreignAlias: merchantlistnotation
        accountlistnotation:
          class: merchantnotation
          local: accountcriteria_id
          foreign: account_id
          foreignAlias: accountlistnotation
    Mais a l'execution j'ai une belle erreur... :

    SQLSTATE[HY000]: General error: 1005 Ne peut créer la table 'winefinder.#sql-ccc_169' (Errcode: 150). Failing Query: "ALTER TABLE merchantnotation ADD CONSTRAINT mmmm FOREIGN KEY (merchant_id) REFERENCES merchantnotationcriteria(merchantcriteria_id)". Failing Query: ALTER TABLE merchantnotation ADD CONSTRAINT mmmm FOREIGN KEY (merchant_id) REFERENCES merchantnotationcriteria(merchantcriteria_id)

    Merci encore de votre aide

  10. #10
    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
    Tu explores un domaine auquel je n'ai pas touché, du moins avec doctrine.

    Mais ton liens vers "merchantlistnotation" ne peut marcher, vu que tu as deux champs à prendre en compte (clef double)/

    Essaye en passant un tableau avec les deux clef dans ta relation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        merchantlistnotation:
          class: merchantnotation
          local: [ merchantcriteria_id, accountcriteria_id ]
          foreign: [ merchant_id, account_id ]
          foreignAlias: merchantlistnotation
    Sans garanties

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut
    Malheureusement toujours sans succès....
    En espérant que quelqu'un ait la réponse...

  12. #12
    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
    J'ai cherché sur le site de doctrine, ce n'est pas clair (cela veut dire que je n'ai rien trouvé qui disent ce qui suit, c'est juste mes déductions).

    Dans la version 1.2 actuellement "livrée" avec symfony, il ne serait pas possible de gérer totalement les clefs multiples. On peut en définir, mais pas dans les relations.

    Cela pourrait être implémenté dans la version 2, en cours d'implémentation, mais ne figure que (très) partiellement dans la documentation.


    La solution (non satisfaisante) serait de créer un index unique sur deux champs pour "simuler" la clef multiple et de créer une nouvelle clef utilisé à partir de là dans les relations. C'est pas top.

    Il reste une autre possibilité qui, peut-être, nous fournira une solution : faire de l'ingénierie inverse. Tu crées avec phpMyAdmin ou tout autre outils (HeidiSQL n'est pas mal pour cela) la structure que tu souhaites sous MySql puis tu importes dans un joli projet vide. Et tu regardes comment il te génère le shema.yml.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Par défaut
    Problème résolu.....oui et non. En fait, pas ce problème spécifique mais je suis allé trop vite sur le modèle, il y a une table intermédiaire de trop... :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    criteria:
      connection: doctrine
      tableName: criteria
      columns:
        name:
          type: string(150)
          notnull: true
     
    merchantnotation:
      connection: doctrine
      tableName: merchantnotation
      columns:
        comment:
          type: string(255)
        evaluation:
          type : integer(4)
        datenotation:
          type: timestamp
          notnull: true
        merchant_id:
          type : integer
          primary: true
        account_id:
          type : integer
          primary: true
        criteria_id:
          type : integer
          primary: true
      relations:
        merchant:
          local: merchant_id
          foreign: id
        account:
          local: account_id
          foreign: id
        criteria:
          local: criteria_id
          foreign: id
     
    merchant:
      connection: doctrine
      tableName: merchant
      columns:
        merchant:
          type: string(255)
          notnull: true
        bigcity:
          type: string(150)
        description:
          type: string(255)
        merchant:
          type: string(255)
          notnull: true
        adress1:
          type: string(255)
        adress2:
          type: string(255)
        zipcode:
          type: string(30)
        city:
          type: string(150)
        webadress:
          type: string(255)
        phone:
          type: string(45)
        fax:
          type: string(45)
        email:
          type: string(255)
        logo:
          type: string(255)
        localsaletax:
          type: decimal(4)
          scale: 2
        totalwinelist:
          type: integer(4)
          unsigned: true
        country_id:
          type: integer
          notnull: true
        created_at:
          type: timestamp
          notnull: true
        created_by:
          type: integer
          notnull: true
        modified_at:
          type: timestamp
        modified_by:
          type: integer
      relations:
        country:
          local: country_id
          foreign: id
          foreignAlias: countries
        creationAccount:
          class: account
          local: created_by
          foreign: id
          foreignAlias: createdmerchant
        modificationAccount:
          class: account
          local: modified_by
          foreign: id
          foreignAlias: modifiedmerchant
      indexes:
        merchant:
          fields: merchant
    Et là ca marche nickel

    merci encore

  14. #14
    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
    Juste.

    Et on a une seul clef par liaison, ce qui confirme ma déduction.

    Reste que faire une liaison sur une clef multiple me semble quelque chose de naturel et que je ne comprend pas pourquoi cela pose tant de difficultés.

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