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

Symfony PHP Discussion :

Récupération enregistrements d'un relations entre deux tables


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 71
    Points : 49
    Points
    49
    Par défaut Récupération enregistrements d'un relations entre deux tables
    Bonjour,

    Voici juste un bout d'un schema.yml pour illustrer mon problème:
    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
     
    Commande:
      actAs:
        Timestampable:    ~
      columns:
        ..... les champs
     
    Devis:
      actAs:
        Timestampable:        ~
      columns:
        commande_id:   { type: integer, notnull: true }
      relations:
        Commande:
          class:          Commande
          alias:          Commande
          foreignType:    one
          local:          commande_id
          foreign:        id
          onDelete:       CASCADE
    Voici mon problème :
    Si je fais Je récupère une instance de Devis, que l'enregistrement existe or pas, ou je voudrais effectuer une condition sur l'existence ou non de ce devis, or il n'y a pas de fonction hasDevis() ou autre, comment puis-je faire ?

    Merci par avance, Cordialement.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    Une comparaison avec NULL ne fonctionne pas ?
    Si oui, tu peux créer une méthode hasDevis() dans la classe Commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function hasDevis()
    {
        return $this->getDevis() != NULL;
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 71
    Points : 49
    Points
    49
    Par défaut
    C'est là qu'est le problème, dans tous les cas il me retourne un objet Devis, même si je n'est pas d'enregistrement j'ai quand même le droit à un objet mais vide, et donc pas équivalent à null.
    Pour pallier à mon problème je suis présentement obliger de faire une comparaison avec la valeur created_at, pour voir si l'enregistrement est un enregistrement qui à bien été enregistré à un moment donné, c'est pas très propre à mon sens mais j'ai le résultat escompté.
    N'y aurait-il pas une solution native, plus propre ??

    Merci de ta réponse rapide, bien qu'elle ne m'aide pas vraiment

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    effectivement il te retournera toujours un objet Devis, même vide si il n'y en a pas

    l'astuce réside dans le fait qu'un objet n'a pas d'Id tant qu'il n'est pas enregistrer
    Donc, si tu récupère un objet vide, donc qui n'existe pas, son Id est null, mais si par contre tu récupère un objet qui lui existe bien l'Id aura forcement une valeur

    Il te suffit donc de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getDevis()->getId() != NULL;
    Il y a peut être encore plus propre, mais ça sera en effet plus pratique que de comparer les dates :p

    Il faut simplement que tu fasses attention si tu réalise des traitements spéciaux dans tes fonctions (notamment quand tu créer des objets). En effet, si tu créer un objet dans une fonction et que tu veux travailler avec dans cette même fonction, il n'aura pas d'attribut Id avant que tu appel la fonction "save()" sur cet objet ! =)

    je ne sais pas pourquoi, mais j'ai l'impression de ne pas avoir été très clair ...

  5. #5
    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
    Schéma revu à ma façon :
    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
    # shema.yml partiel (non testé)
    Commande:
      actAs:
        Timestampable:    ~
      columns:
        ..... les champs
     
    Devi:
      actAs:
        Timestampable:        ~
      columns:
        commande_id:
          type: integer
          notnull: true
      relations:
        Commande:
          foreignAlias: Devis
          onDelete:       CASCADE
    A noter la cure d'amaigrissement de la clause relation, tous ce qui est défini par défaut à été supprimé.
    Important, il ne faut jamais utiliser de nom d'entité (table) qui se termine par un "s". D'où l'absence du "s" pour l'entité "devi" et son apparition en tant que nom du liens depuis l'autre côté de la relation "foreignAlias" qui permet de prévenir que le retour est une collection (Doctrine_Collection) et non pas un enregistrement.

    Ta méthode getDevis() te retourne donc systèmatiquement un Doctrine_Collection qui peut contenir de 0 à une infinité d'objet "Devi" (sans le "s" ceux là). Tu as une méthode count sur la collection qui retourne le nombre d'éléments dans la collection. A partir de là, je pense que tu dois bien voir comment récupérer ta donnée...
    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 !

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/08/2008, 10h13
  2. relation entre deux tables
    Par tojiji dans le forum Access
    Réponses: 6
    Dernier message: 04/07/2006, 14h44
  3. Problème de relation entre deux tables + autre chose
    Par Goth_sensei dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/03/2006, 20h49
  4. [XSD] Relation entre deux tables
    Par fd59 dans le forum Valider
    Réponses: 2
    Dernier message: 09/09/2005, 23h33
  5. Relation entre deux tables
    Par manel007 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/03/2005, 16h54

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