Je pensais que c'était une tâche facile, mais il ne semble pas y avoir de méthode Drupal pour cela. Je suis allé aussi loin en sachant que je devais utiliser EntityFieldQuery
pour cela - parce que l'API dit que les conditions user_load_multiple()
sont obsolètes.
Alors j'ai essayé ceci:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
Pourtant j'ai eu ceci:
PDOException: SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'users.rid' dans 'clause where': SELECT utilisateurs.uid AS id_entité,: type_entité AS, type_entité, NULL AS revision_id,: bundle AS bundle FROM {utilisateurs} utilisateurs WHERE (users.rid =: db_condition_placeholder_0); Tableau ([: db_condition_placeholder_0] => 3 [: type_entité] => utilisateur [: bundle] => utilisateur) dans EntityFieldQuery-> execute ()
Ma première pensée était que je dois joindre à users_roles
-Table et ainsi de suite, mais ce sera conduire à des doublons.
Est-ce que quelqu'un a une idée comment le faire?
->propertyCondition('rid', array(1, 2, 3))
;Réponses:
Pour être honnête, je ne sais pas comment y parvenir. Il est difficile de trouver de bons exemples d'utilisation de EntityFieldQuery. Étant donné que personne n'a encore répondu à cette question et que la solution, je vais essayer de vous aider. Décrit ci-dessous est ma meilleure hypothèse.
Une chose à garder à l'esprit: les rôles sont stockés dans une table différente de celle des utilisateurs. Ils sont ajoutés en utilisant UserController :: attachLoad .
Il semble y avoir trois conditions différentes que vous pouvez utiliser avec un EntityFieldQuery:
L’option la plus logique (s’il en existe une) serait d’utiliser une propriétéCondition, mais à mesure que les rôles sont ajoutés à l’utilisateur dans UserController :: attachLoad, je ne pense pas que EntityFieldQuery y ait accès. Je pense que EntityFieldQuery utilise simplement le schéma défini dans hook_schema ().
Cela me porte à croire que ce que vous essayez de réaliser est impossible. Une solution de contournement serait d'obtenir tous les uids avec une requête normale:
Je n'ai pas accès à Drupal pour le moment, le code ci-dessous est peut-être désactivé. Je suis sûr que quelqu'un corrigera les erreurs.
S'il est possible d'atteindre ce que vous voulez avec EntityFieldQuery, je serai éclairé.
la source
$uids = $result->fetchColumn()
.Ça devrait faire l'affaire
la source
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
pourrait causer une colonne inconnue 'uid'. Dans ce cas, nous devons ajouter$query->propertyCondition('uid', 0, '!=')
pour que la table des utilisateurs soit dans la requête.Il y a en fait un moyen de le faire. En son cœur, EntityFieldQuery (EFQ) est simplement une requête de base de données qui peut être modifiée avec les hooks alter alter de requête.
Exemple le plus simple possible:
Cependant, il y a quelques petites mises en garde qui nécessiteraient un codage supplémentaire. Par exemple, dans le cas où la seule condition présente dans EFQ est une condition de champ, la base-utilisateur ne sera pas présente. Ainsi, lorsque vous recherchez des utilisateurs par rôle et une seule condition de champ, vous devez également vous assurer que La table users est jointe et si ce n’est pas le cas, joignez-la manuellement, ce qui est un processus fastidieux.
Mais pour vos besoins, cela fera l'affaire. Réaliser que vous pouvez modifier manuellement les requêtes EFQ ouvre un monde immense d'opportunités pour créer des requêtes très puissantes tout en maintenant l'interface propre et Drupal.
Faites-moi savoir si vous avez des questions ou des problèmes.
Edit: J'ai en fait trouvé un moyen un peu plus performant de faire cela et modifié mon code en conséquence.
la source
$query
? Et je pourrais aussi suggérer de changermymodule_get_users_by_rolename
pour ne pas renvoyer le résultat de la requête elle-même, mais pour déréférencer la clé'user'
.la source
Vous pouvez toujours utiliser EntityFieldQuery () une fois que vous avez obtenu les ID utilisateur de votre rôle, si vous le souhaitez, par exemple parce que vous souhaitez utiliser fieldCondition () ou une autre méthode.
Utilisation du tableau $ uids dans l'exemple ci-dessus:
Il serait préférable que EntityFieldQuery ait une méthode de jointure.
la source
la source
$rolename
qui serait utilisé dans l’appel àuser_role_load_by_name
et une vérification pour nous assureruser_role_load_by_name
qu’elle ne renvoie pas la valeur false.OK Ceci est un ancien, mais vous pouvez faire quelque chose comme ceci:
la source
C'est un peu tard pour le jeu, mais je pense que c'est ce que l'OP demandait. par exemple pas de sql, tous drupal. J'espère que d'autres le trouveront utile. La recherche de cela m’a conduit ici et c’est ce que j’ai trouvé.
la source
C'est en effet un sujet plus ancien et j'ai trouvé beaucoup de bonnes approches.
J'améliorerais un peu la solution fournie par @alf, car je pense qu'une requête avec join est la meilleure approche. Cependant, j'aime aussi que mes fonctions aient des paramètres et ne dépendent pas d'une constante. Alors voilà:
la source
Vous trouverez ici de bons exemples d’explications sur l’utilisation de EntityFieldQuery:
mais, comme Berdir l'a dit pour le moment, "EFQ ne prend en charge que les propriétés de base d'une entité, qui font partie de la table d'entités. Les rôles d'un utilisateur ne sont en aucune manière exposés au système de l'entité".
la source
Je ne doute pas que cela puisse être simplifié. Cela peut être fait cependant pour Drupal 8:
la source