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 08/01/2011, 09h42   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : août 2006
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : août 2006
Messages : 49
Points : 25
Points : 25
Par défaut embedRelation et requète Doctrine particulière

Bonjour,

J'aimerais faire un formulaire qui permette d'éditer un DoctrineObject ainsi que les DoctrineObject liés par une relation One-to-Many. Spontanément, je pense à embedRelation() parce que ça gère tout tout seul et que souvent la flemmardise est une bonne chose.

Le hic, c'est que je voudrais ne récupérer qu'une partie des enregistrements liés, sur la base d'un WHERE sur un des champs. Et je trouve assez peu de détails concernant embedRelation() sur le net.

Apparemment, on ne peut pas lui ajouter d'options. J'ai trouvé un exemple qui fait un ORDER BY directement sur le schéma Doctrine, mais rien pour le WHERE. Du coup, je me demandais s'il était possible de définir, pour le formulaire uniquement, un query sur la classe Doctrine (à la manière un peu de la surcharge de la requête de l'Admin Générator) ou éventuellement en utilisant un filtre (tout aussi peu documenté sur le net) ou par une autre méthode sioux...

Sinon je devrais repartir de zéro en singeant le comportement de l'embedRelation, mais tout de suite ne pas utiliser les outils à disposition me paraît moins propre...
CaraG33k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 10h30   #2
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
Je ne suis pas sur ni de se que tu veux, ni du contexte.

Es-tu dans un formulaire d'administration ?

Tu veux un formulaire qui va afficher des données d'une table A qui est liée à B en 1<->n. Tu veux tous les champs de A et seulement une partie de B. Est-ce cela ?

Est-il rentable de t'embêter avec cela (même si c'est sémantiquement plus logique) ? Je veux dire par là, est ce que le gain en terme d'accès à la base et d'hydratation des objets va être rentable ? Si tu gagnes 0.02s en perf, je ne m'en occuperais même pas.

Tu peux générer la requête que tu veux, si tu as désactivé les champs dans le form, tu ne dois pas avoir de problème, ni lors de l'affichage, ni lors de la modification. Mais es-ce rentable en terme de performance ?
__________________
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
Vieux 08/01/2011, 10h48   #3
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : août 2006
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : août 2006
Messages : 49
Points : 25
Points : 25
Ah non, désolé j'ai pas été clair.

Je ne veux éditer qu'un enregistrement de A (peu importe les champs, ça sera géré par la classe form) et je veux pouvoir éditer dans le même formulaire une partie des enregistrements de B parmi ceux liés à l'enregistrement de A.

Le comportement habituel de embedRelation, c'est de retourner, pour édition, tous les enregistrements de B liés à l'enregistrement courant de A. Et c'est juste ce comportement que je veux restreindre avec une requếte (type SELECT * FROM B WHERE B.tri = option_tri).

Et je ne cherche pas (encore) à chipoter sur les performances mais à limiter le nombre de ligne tapées d'une part, et surtout à essayer d'exploiter au maximum le bel outil (embedRelation) que Symfony nous fournit.

Et bien entendu, je ne suis pas dans un formulaire d'administration.
CaraG33k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 10h58   #4
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
Alors, je ne vois pas le problème.

Tu fais ta requête sur les deux tables avec doctrine et un where en plus de la liaison normale.
Code :
1
2
3
4
5
6
 
$q = Doctrine::getTable('TableA')
               ->createQuery('a')
               ->lesftJoin('a.relationAvecBs b')
               ->where('b.monChamp = ?', 'ceQueJeVeux');
$data = $q->execute();

Dans le form, tu récupères les enregistrements de B par
Code :
1
2
3
4
5
6
 
foreach ($data-relationAvecBs as $dataB)
{
    $formB = new tableBForm($dataB);
    $this->embedForm($formB);
}
Code fait à la va vite et sans vérifications aucune, à considérer comme du pseudo code.

Ca devrait marcher.
__________________
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
Vieux 08/01/2011, 11h15   #5
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : août 2006
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : août 2006
Messages : 49
Points : 25
Points : 25
Certes. C'était d'ailleurs mon idée de "repartir de zéro". J'avais juste dans l'idée d'en profiter pour en apprendre un peu plus sur embedRelation plutôt que le classique embedForm. Ceci dit, c'est vrai que je n'y gagnerais pas des masses (juste le plaisir de se donner un défi pour mieux connaître le framework )
CaraG33k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 12h44   #6
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
A priori, l'utilisation n'est pas très différente, par habitude j'utilise l'embedForm.

La documentation me semble plutôt légère, si tu trouves, documentes !

Si non, tu as le plugin ahDoctrineEasyEmbeddedRelationsPlugin qui est très intéressant aussi.
__________________
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 18h08.


 
 
 
 
Partenaires

Hébergement Web