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 :

array inclu dans une collection


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Par défaut array inclu dans une collection
    Bonjour à tous,

    J'ai une table User et une table Group avec une relation many to many: donc une 3eme table User_Group.
    Je recupere grace a des checkboxes une liste de groupes sous forme d'array ($group_lists) et je veux récupérer dans la BDD tous les Users qui sont AU MOINS inscrit dans tous les groupes selectionnés. Je cherche donc à vérifier l'inclusion de $group_lists dans $user->Groups .

    J'avais pensé à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Doctrine_Query::create()
    ->from('User u')
    ->innerJoin('u.Groups g')
    ->whereIn('g.id',$group_lists)
    Sans succès car il suffit qu'un utilisateur soit dans un groupe de la liste et il est selectionné.

    J'ai tenté d'inventer un 'ALL IN' (non c'est pas du poker ) mais ça n'a pas marché bien sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->whereIn('u.Groups ALL',$group_lists)
    Merci,
    John

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Peut-être quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $q = Doctrine_Query::create()
    ->from('User u')
    ->innerJoin('u.Groups g');
     
    foreach($groups_list as $key => $groupId) {
      $q->andWhere('g.id = ?', $groupId);
    }

  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
    Ceci ne vas pas être simple, vu qu'en MySql il n'y a pas d'INTERSECT pour nous aider.

    J'ai bien un truc en SQL qui pourrait y arriver, mais il va te falloir tester.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT u.* 
    FROM user u
    WHERE u.id IN (
              SELECT ug.user_id
              FROM user_group ng
              WHERE ug.group_id IN (4,5,9)
              GROUP BY ug.user_id
              HAVING count(ug.*) = 3;
              )
    Il est possible que ceci réponde à ta demande, pas eu le temps de tester mais c'est la première piste que je voie.
    L'idée est de récupérer les ID des users qui font partie des trois groupes, s'ils en font partie, ils vont apparaître trois fois dans la sous select, donc le count doit être égal à trois et on ne garde que ceux là... Bon, en principe cela pourrais marcher. La requête parent est toute simple.

    Si cela marche, il suffira de traduire en DQL.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Par défaut
    Merci Herode et Michel pour vos réponses,
    finalement la méthode avec le count et whereIn marche très bien: voici le code que j'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Doctrine_Query::create()
    ->from('User u')
    ->innerJoin('u.Groups g')
    ->whereIn('g.id',$groups_list)
    ->groupBy('u.id')
    ->having('count(g.id) = ?',count($groups_list));
    On récupère donc chaque utilisateur qui est au moins dans un groupe, on ordonne les résultats par id des utilisateurs et on garde seulement ceux qui ont le nombre exact de groupes. C'est donc la méthode donnée par Michel mais avec un Inner Join au lieu d'un sous select. Ca marche, ensuite au niveau performances je pense que les deux méthodes sont équivalentes, à confirmer?

  5. #5
    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
    Pas con du tout d'intégrer le tous dans une requête et de virer ainsi la sous requête.

    Côté performance, il faudrait tester, mais, à priori, le travail sur la requête devrait être moins pénalisant qu'un tris ultérieur dans un array.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Suppression d'objets dans une collection
    Par master56 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/06/2010, 21h46
  2. [9i] insertion dans une collection
    Par meuledor dans le forum Oracle
    Réponses: 2
    Dernier message: 17/02/2006, 12h02
  3. Réponses: 8
    Dernier message: 03/02/2006, 15h15
  4. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  5. Controle dans une collection
    Par rolototo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/02/2005, 14h12

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