Ich fand das eine leichte Aufgabe, aber es scheint keine Drupal-Methode dafür zu geben. Ich bin soweit gekommen, dass ich weiß, dass ich das verwenden muss EntityFieldQuery
- weil die API besagte Bedingungen für user_load_multiple()
veraltet sind.
Also habe ich Folgendes versucht:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
Trotzdem habe ich folgendes verstanden:
PDOException: SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'users.rid' in 'where-Klausel': SELECT users.uid AS entity_id,: entity_type AS entity_type, NULL AS revision_id,: Bündel AS Bündel FROM {users} users WHERE (users.rid =: db_condition_placeholder_0); Array ([: db_condition_placeholder_0] => 3 [: entity_type] => Benutzer [: Bundle] => Benutzer) in EntityFieldQuery-> execute ()
Mein erster Gedanke war also, dass ich mich mit users_roles
-Table usw. verbinden müsste, aber das wird zu Duplikaten führen.
Hat jemand eine Idee, wie es geht?
->propertyCondition('rid', array(1, 2, 3))
.Antworten:
Um ehrlich zu sein, ich habe keine Ahnung, wie dies erreicht werden kann. Gute Beispiele für die Verwendung der EntityFieldQuery sind schwer zu finden. Da noch niemand diese Frage beantwortet hat und ich auch an der Lösung interessiert bin, werde ich versuchen, Ihnen zu helfen. Unten beschrieben ist meine beste Vermutung.
Beachten Sie: Rollen werden in einer anderen Tabelle als Benutzer gespeichert. Sie werden mit UserController :: attachLoad hinzugefügt .
Es scheint drei verschiedene Bedingungen zu geben, die Sie mit einer EntityFieldQuery verwenden können:
Die logischste Option (wenn es eine gibt) wäre die Verwendung einer propertyCondition, aber wenn dem Benutzer in UserController :: attachLoad Rollen hinzugefügt werden, hat die EntityFieldQuery meines Erachtens keinen Zugriff darauf. Ich denke, die EntityFieldQuery verwendet nur das in hook_schema () definierte Schema.
Dies lässt mich glauben, dass das, was Sie erreichen wollen, unmöglich ist. Eine Problemumgehung wäre, alle Benutzeroberflächen mit einer normalen Abfrage abzurufen:
Ich habe momentan keinen Zugriff auf Drupal, daher ist der folgende Code möglicherweise deaktiviert. Ich bin mir sicher, dass jemand die Fehler korrigieren wird.
Wenn es möglich ist, mit EntityFieldQuery das zu erreichen, was Sie wollen, werde ich aufgeklärt.
quelle
$uids = $result->fetchColumn()
.Es sollte den Trick machen
quelle
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
Allerdings sollte ich beachten, dass die unbekannte Spalte "UID" verursachen könnte. In diesem Fall müssen wir hinzufügen$query->propertyCondition('uid', 0, '!=')
, damit sich die Benutzertabelle in der Abfrage befindet.Es gibt tatsächlich einen Weg, dies zu tun. In seinem Herzen ist die EntityFieldQuery (EFQ) nur eine Datenbankabfrage, die mit Abfrage-Änderungs-Hooks geändert werden kann.
Einfachstes mögliches Beispiel:
Es gibt jedoch ein paar kleine Einschränkungen, die mehr Codierung erfordern würden. Wenn beispielsweise die einzige Bedingung, die in EFQ vorhanden ist, eine Feldbedingung ist, ist die Benutzertabelle nicht vorhanden. Wenn Sie also Benutzer nach Rolle und einer einzelnen Feldbedingung abrufen, müssen Sie auch sicherstellen, dass die Die Benutzertabelle wird verbunden, und wenn nicht, verbinden Sie sie manuell, was ein mühsamer Prozess ist.
Aber für Ihren Bedarf wird dies den Trick tun. Die Erkenntnis, dass Sie EFQ-Abfragen manuell ändern können, eröffnet eine Fülle von Möglichkeiten, sehr leistungsfähige Abfragen zu erstellen, während die Benutzeroberfläche sauber und Drupal bleibt.
Lassen Sie mich wissen, wenn Sie Fragen oder Probleme haben.
Bearbeiten: Ich habe tatsächlich eine etwas performantere Methode gefunden und meinen Code entsprechend geändert.
quelle
$query
? Und ich könnte auch vorschlagen, zu ändern,mymodule_get_users_by_rolename
um nicht das Ergebnis der Abfrage selbst zurückzugeben, sondern den Schlüssel zu dereferenzieren'user'
.quelle
Sie können EntityFieldQuery () weiterhin verwenden, sobald Sie die Benutzer-IDs für Ihre Rolle erhalten, wenn Sie dies möchten, zum Beispiel, weil Sie fieldCondition () oder eine andere Methode verwenden möchten.
Verwenden des Arrays $ uids im obigen Beispiel:
Es wäre schöner, wenn EntityFieldQuery eine Join-Methode hätte.
quelle
quelle
$rolename
, der im Aufruf von verwendet wird,user_role_load_by_name
und eine Überprüfung, um sicherzustellen,user_role_load_by_name
dass nicht false zurückgegeben wird.OK Dies ist eine alte, aber Sie könnten so etwas tun:
quelle
Das ist etwas spät für das Spiel, aber ich denke, es ist das, wonach die OP gefragt hat. zB kein SQL, alles Drupal. Hoffentlich finden es andere nützlich. Die Suche danach hat mich hierher geführt und das ist mir eingefallen.
quelle
Dies ist in der Tat ein älteres Thema und ich habe viele gute Ansätze gefunden.
Ich würde die von @alf bereitgestellte Lösung ein wenig verbessern, da ich denke, dass eine Abfrage mit Join der beste Ansatz ist. Ich möchte aber auch, dass meine Funktionen Parameter haben und nicht von einer Konstanten abhängig sind. Also hier geht es:
quelle
Hier finden Sie gute Erklärungsbeispiele zur Verwendung der EntityFieldQuery:
Aber genau wie Berdir sagte "EFQ unterstützt nur grundlegende Eigenschaften einer Entität, die Teil der Entitätstabelle sind. Die Rollen eines Benutzers sind in keiner Weise für das Entitätssystem verfügbar."
quelle
Ich habe keinen Zweifel, dass dies vereinfacht werden kann. Dies kann jedoch für Drupal 8 durchgeführt werden:
quelle