Myślałem, że to łatwe zadanie, ale wydaje się, że nie ma do tego metody Drupala. Doszedłem do tego stopnia, że wiedziałem, że muszę do tego użyć EntityFieldQuery
- ponieważ API powiedział, że warunki user_load_multiple()
są przestarzałe.
Więc próbowałem tego:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
Ale mam to:
PDOException: SQLSTATE [42S22]: Nie znaleziono kolumny: 1054 Nieznana kolumna „users.rid” w klauzuli „where”: SELECT users.uid AS entity_id,: entity_type AS entity_type, NULL AS revision_id,: pakiet AS pakiet OD {users} użytkowników GDZIE (users.rid =: db_condition_placeholder_0); Tablica ([: db_condition_placeholder_0] => 3 [: entity_type] => użytkownik [: pakiet] => użytkownik) w EntityFieldQuery-> execute ()
Więc moją pierwszą myślą było to, że będę musiał przyłączyć się users_roles
-Tabela i tak dalej, ale to będzie prowadzić do duplikatów.
Czy ktoś ma pomysł, jak to zrobić?
->propertyCondition('rid', array(1, 2, 3))
;Odpowiedzi:
Szczerze mówiąc, nie mam pojęcia, jak to osiągnąć. Dobre przykłady użycia EntityFieldQuery są trudne do znalezienia. Ponieważ nikt jeszcze nie odpowiedział na to pytanie i jestem również zainteresowany rozwiązaniem, postaram się pomóc. Opisane poniżej moje najlepsze przypuszczenie.
Należy pamiętać: role są przechowywane w innej tabeli niż użytkownicy. Są dodawane przy użyciu UserController :: attachLoad .
Wydaje się, że istnieją trzy różne warunki, których można użyć z EntityFieldQuery:
Najbardziej logiczną opcją (jeśli taka istnieje) byłoby użycie właściwości conditionCondition , ale ponieważ role są dodawane do użytkownika w UserController :: attachLoad , nie sądzę, aby EntityFieldQuery miał do niego dostęp. Myślę, że EntityFieldQuery po prostu używa schematu zdefiniowanego w hook_schema ().
To prowadzi mnie do przekonania, że to, co próbujesz osiągnąć, jest niemożliwe. Obejściem tego problemu byłoby pobranie wszystkich identyfikatorów UID za pomocą zwykłego zapytania:
Nie mam teraz dostępu do Drupala, więc poniższy kod może być wyłączony. Jestem pewien, że ktoś będzie edytować błędy.
Jeśli możliwe jest osiągnięcie tego, co chcesz dzięki EntityFieldQuery, będę oświecony.
źródło
$uids = $result->fetchColumn()
.To powinno wystarczyć
źródło
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
może to powodować nieznane kolumny „UID”. W takim przypadku musimy dodać$query->propertyCondition('uid', 0, '!=')
, aby tabela użytkowników znajdowała się w zapytaniu.Jest na to sposób. W swoim sercu EntityFieldQuery (EFQ) jest po prostu zapytaniem do bazy danych, które można zmienić za pomocą haków do zmiany zapytania.
Najprostszy możliwy przykład:
Istnieje jednak kilka małych zastrzeżeń, które wymagałyby trochę kodowania. Na przykład pod warunkiem, że jedynym warunkiem występującym w EFQ jest warunek polowy, baza użytkowników nie będzie obecna, więc gdy pobierasz użytkowników według roli i pojedynczego pola warunek, musisz również upewnić się, że Tabela użytkowników jest dołączana, a jeśli nie, ręcznie dołącz do niej, co jest trochę żmudnym procesem.
Ale na twoją potrzebę to załatwi sprawę. Zdanie sobie sprawy z tego, że możesz ręcznie zmieniać zapytania EFQ, otwiera ogromny świat możliwości tworzenia bardzo potężnych zapytań przy jednoczesnym utrzymaniu czystości interfejsu i Drupala.
Daj mi znać, jeśli masz jakieś pytania lub problemy.
Edycja: Znalazłem trochę bardziej wydajny sposób na zrobienie tego i odpowiednio zmieniłem kod.
źródło
$query
? Mogę również zasugerować zmianę,mymodule_get_users_by_rolename
aby nie zwracała wyniku samego zapytania, ale aby oderwać klucz'user'
.źródło
Nadal możesz używać EntityFieldQuery () po otrzymaniu identyfikatorów użytkowników dla swojej roli, jeśli chcesz, na przykład dlatego, że chcesz użyć fieldCondition () lub innej metody.
Używając tablicy $ uids w powyższym przykładzie:
Byłoby ładniej, gdyby EntityFieldQuery miała metodę łączenia.
źródło
źródło
$rolename
który zostałby użyty w wywołaniuuser_role_load_by_name
i sprawdzenie, aby upewnić się,user_role_load_by_name
że nie zwraca false.OK To jest stary, ale możesz zrobić coś takiego:
źródło
Trochę za późno na grę, ale myślę, że o to poprosił OP. np. bez sql, wszystkie drupal. Mam nadzieję, że inni uznają to za przydatne. Poszukiwania tego doprowadziły mnie tutaj i właśnie to wymyśliłem.
źródło
To jest rzeczywiście starszy temat i znalazłem wiele dobrych podejść.
Poprawiłbym trochę rozwiązanie dostarczone przez @alf, ponieważ myślę, że jedno zapytanie z łączeniem jest najlepszym podejściem. Jednak lubię też, aby moje funkcje miały parametry i nie zależały od stałej. A więc oto:
źródło
Dobre objaśnienia dotyczące korzystania z EntityFieldQuery można znaleźć tutaj:
ale tak jak na razie powiedział Berdir: „EFQ obsługuje tylko podstawowe właściwości encji, które są częścią tabeli encji. Role użytkownika nie są w żaden sposób narażone na system encji”.
źródło
Nie mam wątpliwości, że można to uprościć. Można to jednak zrobić w przypadku drupala 8:
źródło