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 :

embedRelation et requète Doctrine particulière


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2006
    Messages : 55
    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...

  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
    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 ?

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2006
    Messages : 55
    Par défaut
    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.

  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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2006
    Messages : 55
    Par défaut
    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 )

  6. #6
    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
    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.

Discussions similaires

  1. Lire les résultats d'une requête Doctrine
    Par Vince57 dans le forum ORM
    Réponses: 5
    Dernier message: 18/05/2010, 15h47
  2. Première requête doctrine
    Par joff_symfony dans le forum ORM
    Réponses: 3
    Dernier message: 05/05/2010, 09h01
  3. [SQL] Requête assez particulière
    Par rems033 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/06/2008, 15h37
  4. Requête SQL particulière dans procédure stockée
    Par stephane.julien dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/05/2008, 10h56
  5. Requête SQL particulière
    Par stephane.julien dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/03/2008, 09h32

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