Pensé que era una tarea fácil, sin embargo, no parece haber un método Drupal para esto. Llegué a saber que tengo que usar EntityFieldQuery
para esto, porque la API dijo que las condiciones user_load_multiple()
están en desuso.
Entonces intenté esto:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
Sin embargo, tengo esto:
PDOException: SQLSTATE [42S22]: Columna no encontrada: 1054 Columna desconocida 'users.rid' en 'cláusula where': SELECT users.uid AS entity_id,: entity_type AS entity_type, NULL AS revision_id,: bundle AS bundle FROM {users} usuarios WHERE (users.rid =: db_condition_placeholder_0); Matriz ([: db_condition_placeholder_0] => 3 [: entity_type] => user [: bundle] => user) en EntityFieldQuery-> execute ()
Así que lo primero que pensé fue que tendría que unirse con users_roles
-Tabla y así sucesivamente, pero que voy a llevar a los duplicados.
¿Alguien tiene una idea de cómo hacerlo?
->propertyCondition('rid', array(1, 2, 3))
;Respuestas:
Para ser honesto, no tengo idea de cómo lograr esto. Buenos ejemplos de cómo usar EntityFieldQuery son difíciles de encontrar. Como nadie ha respondido esta pregunta todavía y también estoy interesado en la solución, intentaré ayudarte. A continuación se describe mi mejor suposición.
Una cosa a tener en cuenta: los roles se almacenan en una tabla diferente a la de los usuarios. Se agregan usando UserController :: attachLoad .
Parece que hay tres condiciones diferentes que puede usar con un EntityFieldQuery:
La opción más lógica (si hay una) sería usar una propiedad Condición , pero como los roles se agregan al usuario en UserController :: attachLoad , no creo que EntityFieldQuery tenga acceso a él. Creo que EntityFieldQuery solo usa el esquema definido en hook_schema ().
Esto me lleva a creer que lo que estás tratando de lograr es imposible. Una solución alternativa sería obtener todos los uid con una consulta normal:
No tengo acceso a Drupal en este momento, por lo que el siguiente código podría estar desactivado. Estoy seguro de que alguien editará los errores.
Si es posible lograr lo que quiere con EntityFieldQuery, me iluminaré.
fuente
$uids = $result->fetchColumn()
.Debería hacer el truco
fuente
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
podría causar una columna desconocida 'uid'. En ese caso, necesitamos agregar$query->propertyCondition('uid', 0, '!=')
, por lo que la tabla de usuarios estará en la consulta.De hecho, hay una manera de hacer esto. En esencia, el EntityFieldQuery (EFQ) es solo una consulta de base de datos que puede modificarse con enlaces de consulta.
El ejemplo más simple posible:
Sin embargo, hay algunas pequeñas advertencias con esto que requerirían más codificación. Por ejemplo, en el cuidado de la única condición presente en el EFQ que es una fieldCondition, la tabla de base de usuarios no estará presente, por lo que cuando busque usuarios por rol y una sola fieldCondition, también deberá asegurarse de que la tabla de usuarios está unida y, si no, únala manualmente, lo cual es un proceso un poco tedioso.
Pero para su necesidad, esto hará el truco. Al darse cuenta de que puede modificar manualmente las consultas de EFQ, se abre un enorme mundo de oportunidades para crear consultas muy potentes y, al mismo tiempo, mantener la interfaz limpia y Drupal.
Avíseme si tiene alguna pregunta o problema.
Editar: En realidad, encontré una forma un poco más eficiente de hacer esto y cambié mi código en consecuencia.
fuente
$query
? Y también podría sugerir cambiarmymodule_get_users_by_rolename
para no devolver el resultado de la consulta en sí, sino para desreferenciar la clave'user'
.fuente
Todavía puede usar EntityFieldQuery () una vez que obtenga los identificadores de usuario para su rol, si lo desea, por ejemplo, porque desea usar fieldCondition () u otro método.
Usando la matriz $ uids en el ejemplo anterior:
Sería mejor si EntityFieldQuery tuviera un método de unión.
fuente
fuente
$rolename
que se usaría en la llamadauser_role_load_by_name
y una verificación para asegurarme deuser_role_load_by_name
que no devuelva falso.OK Esta es una vieja, pero podrías hacer algo como esto:
fuente
Esto es un poco tarde para el juego, pero creo que es lo que pedía el OP. por ejemplo, no sql, todo drupal. Esperemos que otros lo encuentren útil. La búsqueda de esto me llevó aquí y esto es lo que se me ocurrió.
fuente
Este es de hecho un tema antiguo y encontré muchos buenos enfoques.
Mejoraría un poco la solución provista por @alf, porque creo que una consulta con join es el mejor enfoque. Sin embargo, también me gusta que mis funciones tengan parámetros y no dependan de una constante. Así que aquí va:
fuente
Puede encontrar buenos ejemplos de explicaciones sobre cómo usar EntityFieldQuery aquí:
pero tal como Berdir dijo por ahora "EFQ solo admite propiedades básicas de una entidad, que son parte de la tabla de entidades. Las funciones de un usuario no están expuestas de ninguna manera al sistema de entidades".
fuente
No tengo dudas de que esto se puede simplificar. Sin embargo, esto se puede hacer para drupal 8:
fuente