【发布时间】:2009-07-25 21:48:39
【问题描述】:
我想获取分配了特定角色的所有用户的列表。我可以编写自己的 SQL,但我想尽可能多地使用 api。
【问题讨论】:
我想获取分配了特定角色的所有用户的列表。我可以编写自己的 SQL,但我想尽可能多地使用 api。
【问题讨论】:
您可以使用 entity_load 来获取用户数组。这是将为管理员用户创建所有电子邮件列表的示例(用于发送通知)
<?php
$users = entity_load('user');
$emails = '';
foreach($users as $user) {
if (array_key_exists(3, $user->roles)) {
if (strlen($emails) > 0) {
$emails .= ' ' . $user->mail;
} else {
$emails = $user->mail;
}
}
}
?>
【讨论】:
entity_load('user') 实际上确实将所有站点用户作为对象加载到由 uid 索引的数组中。
这类任务通常没有 Drupal API 函数(提取符合特定条件的实体)。它倾向于关注 API 中的单实体 CRUD 函数;其他一切都取决于开发人员自己的 SQL 技能。
“视图”模块允许您构建按角色、权限等过滤的用户列表——但它很容易被矫枉过正。
【讨论】:
对我有用的 SQL:
$用户 = ""; $result = db_query('SELECT users.name AS users_name FROM users users INNER JOIN users_roles users_roles ON users.uid = users_roles.uid 其中 users_roles.rid = 4'); 而 ($existing_user = db_fetch_object($result)) { if ($users != "") $users .= ", "; $users .= $existing_user->users_name; // 或者做任何事情 } 回声$用户;请记住,这是针对 Drupal 6 的,我不确定它对于大型用户群的性能。不确定 Drupal 7。
【讨论】:
var_dump(db_query('SELECT name FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid = 4')->fetchCol());
一个简单的选择是使用 Views 为您生成 SQL(当您按下预览按钮时显示在视图自身下方),然后使用 Drupal SQL abstraction layer 获取您需要的结果,如果您需要访问原始数据而不是显示视图。
看起来有点像这样:
$result = db_query('SELECT users.uid AS uid,
users.mail AS users_mail,
users.name AS users_name
FROM users users');
while ($existing_user = db_fetch_object($result)) {
print_r($existing_user); // or do whatever
}
只需向视图添加更多字段即可获得完整的查询。
【讨论】:
在 Drupal 8 中:
$users = \Drupal\user\Entity\User::loadMultiple();
如果你想得到例如只有管理员:
$admins = [];
foreach ($users as $user) {
if ($user->hasRole('administrator')) {
$admins[] = $user;
}
}
【讨论】:
我不知道任何 API 可以帮助按角色收集用户。这里有一些链接,你可以得到一些东西:http://drupal.org/node/82002。 虽然 SO 是一项很棒的服务,但我建议使用 drupal.org 或 irc.freenode.org 上的 #drupal 频道来解决 Drupal 相关问题。
Ps.:有时 SQL 并不是那么邪恶:)
【讨论】:
在 Drupal 7 中,使用 EntityFieldQuery 是正确的方法。
【讨论】:
在 Drupal 8 中,以下工作(在此示例中,加载具有administrator 角色的所有用户)
\Drupal::service('entity_type.manager')
->getStorage('user')
->loadByProperties(['roles' => 'administrator']);
将返回用户实体列表。
要获取uids 的列表,请使用实体字段查询:
$query = \Drupal::service('entity_type.manager')->getStorage('user')->getQuery();
$query->condition('roles', 'administrator');
$query->execute();
【讨论】: