Я думал, что это простая задача, но, похоже, для этого не существует метода Drupal. Я дошел до того, что понял, что должен использовать EntityFieldQuery
для этого - потому что API сказал, что условия для user_load_multiple()
устарели.
Итак, я попробовал это:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
Все же я получил это:
PDOException: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «users.rid» в «where clause»: SELECT users.uid AS entity_id,: entity_type AS entity_type, NULL AS revision_id,: комплект AS, комплект FROM {пользователи} пользователи ГДЕ (users.rid =: db_condition_placeholder_0); Массив ([: db_condition_placeholder_0] => 3 [: entity_type] => user [: bundle] => user) в EntityFieldQuery-> execute ()
Так что моя первая мысль была, что я должен был бы присоединиться к users_roles
-столам и так далее, но это будет приводить к дублям.
У кого-нибудь есть идеи как это сделать?
->propertyCondition('rid', array(1, 2, 3))
;Ответы:
Если честно, я понятия не имею, как этого добиться. Хорошие примеры того, как использовать EntityFieldQuery, трудно найти. Поскольку никто еще не ответил на этот вопрос, и я также заинтересован в решении, я постараюсь помочь вам. Описанное ниже - мое лучшее предположение.
Об этом следует помнить: роли хранятся в другой таблице, нежели пользователи. Они добавляются с помощью UserController :: attachLoad .
Кажется, есть три различных условия, которые вы можете использовать с EntityFieldQuery:
Наиболее логичным вариантом (если он есть) было бы использование propertyCondition, но, поскольку роли добавляются пользователю в UserController :: attachLoad, я не думаю, что EntityFieldQuery имеет к нему доступ. Я думаю, что EntityFieldQuery просто использует схему, определенную в hook_schema ().
Это заставляет меня верить, что то, чего вы пытаетесь достичь, невозможно. Обходной путь - получить все идентификаторы с помощью обычного запроса:
У меня нет доступа к Drupal сейчас, поэтому код ниже может быть отключен. Я уверен, что кто-нибудь исправит ошибки.
Если можно достичь желаемого с EntityFieldQuery, я буду просвещен.
источник
$uids = $result->fetchColumn()
.Это должно сделать свое дело
источник
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
может привести к неизвестному столбцу «uid». В этом случае нам нужно добавить$query->propertyCondition('uid', 0, '!=')
, чтобы таблица пользователей была в запросе.На самом деле есть способ сделать это. По своей сути EntityFieldQuery (EFQ) - это просто запрос к базе данных, который можно изменить с помощью хуков изменения запроса.
Простейший возможный пример:
Тем не менее, есть несколько небольших предостережений, которые потребуют еще большего кодирования. Например, в отношении единственного условия, присутствующего в EFQ, являющегося fieldCondition, пользовательская база данных не будет присутствовать, поэтому, когда вы выбираете пользователей по роли и отдельному fieldCondition, вам также необходимо убедиться, что Таблица пользователей присоединяется, а если нет, присоединяется к ней вручную, что немного утомительно.
Но для ваших нужд это поможет. Понимание того, что вы можете вручную изменять запросы EFQ, открывает огромный мир возможностей для создания очень мощных запросов, сохраняя при этом интерфейс в чистоте и Drupal.
Дайте мне знать, если у вас есть какие-либо вопросы или проблемы.
Редактировать: я на самом деле нашел более эффективный способ сделать это и изменил свой код соответственно.
источник
$query
? И я мог бы также предложить изменить,mymodule_get_users_by_rolename
чтобы не возвращать результат самого запроса, а чтобы разыменовать ключ'user'
.источник
Вы по-прежнему можете использовать EntityFieldQuery (), как только вы получите идентификаторы пользователей для своей роли, например, если вы хотите использовать fieldCondition () или другой метод.
Используя массив $ uids в приведенном выше примере:
Было бы лучше, если бы EntityFieldQuery имел метод соединения.
источник
источник
$rolename
, который будет использоваться при вызове,user_role_load_by_name
и проверку, чтобы убедиться, чтоuser_role_load_by_name
он не возвращает false.Хорошо, это старый, но вы могли бы сделать что-то вроде этого:
источник
Это немного поздно для игры, но я думаю, что это то, о чем просил ОП. Например, нет sql, все друпал. Надеюсь, другие найдут это полезным. Поиски этого привели меня сюда, и это то, что я придумал.
источник
Это действительно старая тема, и я нашел много хороших подходов.
Я бы немного улучшил решение, предоставленное @alf, потому что я думаю, что один запрос с объединением - лучший подход. Однако мне также нравится, что мои функции имеют параметры и не зависят от константы. Так что вот так:
источник
Вы можете найти хорошие примеры объяснений о том, как использовать EntityFieldQuery здесь:
но, как сказал Бердир, на данный момент «EFQ поддерживает только базовые свойства объекта, которые являются частью таблицы объектов. Роли пользователя никоим образом не раскрываются для системы объектов».
источник
Я не сомневаюсь, что это можно упростить. Это может быть сделано для Drupal 8:
источник