Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2011, 17h02   #1
Futur Membre du Club
 
Homme Mickael
Étudiant
Inscription : novembre 2008
Messages : 66
Détails du profil
Informations personnelles :
Nom : Homme Mickael
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 66
Points : 15
Points : 15
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 :
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.
mixka13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 17h22   #2
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
Une comparaison avec NULL ne fonctionne pas ?
Si oui, tu peux créer une méthode hasDevis() dans la classe Commande :
Code :
1
2
3
4
public function hasDevis()
{
    return $this->getDevis() != NULL;
}
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 18h08   #3
Futur Membre du Club
 
Homme Mickael
Étudiant
Inscription : novembre 2008
Messages : 66
Détails du profil
Informations personnelles :
Nom : Homme Mickael
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 66
Points : 15
Points : 15
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
mixka13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 17h11   #4
Invité de passage
 
Homme
Étudiant
Inscription : 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 : 3
Points : 3
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 :
$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 ...
arte61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 17h19   #5
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Schéma revu à ma façon :
Code :
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h10.


 
 
 
 
Partenaires

Hébergement Web