【问题标题】:read field values without loading the user objects in drupal 7读取字段值而不在 drupal 7 中加载用户对象
【发布时间】:2015-02-03 17:03:03
【问题描述】:

如果我有一组已知的用户,例如。按 UID $users = {123, 435, 5463, 5678}。我想读取存储在一个自定义字段中的值,例如已添加到其用户对象的 field_current_status 是否有任何方法可以在不加载其用户对象的情况下为每个人读取此 1 值。

我不想为很多用户加载大量数据,只是为了从每个用户那里获得 1 个价值。

我查看了许多功能,包括以下这些;

  • field_get_items($entity_type, $entity, $field_name, $langcode = NULL)
  • field_view_field($entity_type, $entity, $field_name, $display = array(), $langcode = NULL)
  • field_view_value($entity_type, $entity, $field_name, $item, $display = array(), $langcode = NULL)
  • user_load_multiple($uids = array(), $conditions = array(), $reset = FALSE)

这些都需要加载用户对象,例如使用 user_load($uid) 或实际上做同样的事情。

有任何 Drupal 方法可以做到这一点,还是我必须编写自定义数据库查询?

【问题讨论】:

    标签: drupal-7


    【解决方案1】:

    在 Drupal 中执行此操作的标准方法是使用 user_load_multiple($user_uids) 加载用户,这通过同时加载所有对象来节省数据库查询的开销。然后,您可以遍历用户并提取必填字段:

    $users = user_load_multiple($user_uids);
    if (!$users) {
      return FALSE;
    }
    
    foreach ($users as $user) {
      $field_current_status = field_get_items('user', $user, 'field_current_status');
      if (!$field_current_status) {
        continue;
      }
    
      // Handle $field_current_status.
    }
    

    就内存而言,除非您要加载大量用户,否则您应该没有问题 - Drupal 本身对内存有很高的需求。如果内存仍然是您关心的问题,那么您可以使用db_select()db_query() 构建查询以将 field_current_status 表与 users 表连接起来。

    如果这是一个需要经常发生的过程,那么可能值得考虑安排 cron 以逐块执行。

    【讨论】:

    • 谢谢,我很感激你的努力,但正如我提到的,我已经考虑过 user_load_multiple,这是一个频繁的过程,可能需要查看数百个用户。它不能被安排,因为它是事件驱动的。我会看看 db_select() 和 db_query()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多