【问题标题】:Is it possible to use the Drupal api to get a list of users?是否可以使用 Drupal api 获取用户列表?
【发布时间】:2009-07-25 21:48:39
【问题描述】:

我想获取分配了特定角色的所有用户的列表。我可以编写自己的 SQL,但我想尽可能多地使用 api。

【问题讨论】:

    标签: php drupal


    【解决方案1】:

    您可以使用 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;
        }
      }
    }
    ?>
    

    【讨论】:

    • 虽然伊顿接受的答案似乎是 Drupal 的情况,但entity_load('user') 实际上确实将所有站点用户作为对象加载到由 uid 索引的数组中。
    • 这可行,但效率极低,对于拥有数千名用户的网站来说,这将是一个糟糕的主意。
    【解决方案2】:

    这类任务通常没有 Drupal API 函数(提取符合特定条件的实体)。它倾向于关注 API 中的单实体 CRUD 函数;其他一切都取决于开发人员自己的 SQL 技能。

    “视图”模块允许您构建按角色、权限等过滤的用户列表——但它很容易被矫枉过正。

    【讨论】:

    • 我会自己回答,但我觉得我应该对此进行扩展。 Drupal(至少核心)中没有允许您列出用户和按角色过滤的功能。您可以编写自己的函数或像伊顿所说的那样,使用视图创建用户列表。
    • 真的应该使用视图。这是您正在寻找的解决方案。
    【解决方案3】:

    对我有用的 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。

    【讨论】:

    • 性能会很好。您在 D7 代码中的示例:var_dump(db_query('SELECT name FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid = 4')-&gt;fetchCol());
    【解决方案4】:

    一个简单的选择是使用 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
      }
    

    只需向视图添加更多字段即可获得完整的查询。

    【讨论】:

    • Views SQL 过于复杂,试试 'SELECT uid, mail, name FROM {users}'
    【解决方案5】:

    在 Drupal 8 中:

    $users = \Drupal\user\Entity\User::loadMultiple();
    

    如果你想得到例如只有管​​理员:

    $admins = [];
    foreach ($users as $user) {
      if ($user->hasRole('administrator')) {
        $admins[] = $user;
      }
    }
    

    【讨论】:

      【解决方案6】:

      我不知道任何 API 可以帮助按角色收集用户。这里有一些链接,你可以得到一些东西:http://drupal.org/node/82002。 虽然 SO 是一项很棒的服务,但我建议使用 drupal.org 或 irc.freenode.org 上的 #drupal 频道来解决 Drupal 相关问题。

      Ps.:有时 SQL 并不是那么邪恶:)

      【讨论】:

      • 我同意。我看到很多 Wordpress 插件直接查询数据库而不是使用预定义的函数。
      • 只是评论补充说 StackOverflow 非常适合 Drupal 问题,更多人应该在这里提问。
      • sql 查询应该避免,因为 drupal7 将使用新的 db api 来抽象 SQL(所以你可以使用像 mongodb 这样的东西:)
      【解决方案7】:

      在 Drupal 7 中,使用 EntityFieldQuery 是正确的方法。

      【讨论】:

      • 你能提供一个例子来说明如何做到这一点吗?
      【解决方案8】:

      在 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();
      

      【讨论】:

        猜你喜欢
        • 2017-12-19
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 2016-10-09
        相关资源
        最近更新 更多