Eu pensei que era uma tarefa fácil, mas não parece haver um método Drupal para isso. Cheguei ao ponto de saber que tenho que usar EntityFieldQuery
para isso - porque a API disse que as condições user_load_multiple()
estão obsoletas.
Então eu tentei isso:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
No entanto, eu entendi isso:
PDOException: SQLSTATE [42S22]: Coluna não encontrada: 1054 Coluna desconhecida 'users.rid' in 'where cláusula': SELECT users.uid AS entity_id,: entity_type AS entity_type, NULL AS revision_id,: bundle AS bundle FROM users {users} users WHERE (users.rid =: db_condition_placeholder_0); Matriz ([: db_condition_placeholder_0] => 3 [: entity_type] => user [: bundle] => user) em EntityFieldQuery-> execute ()
Então, meu primeiro pensamento foi que eu teria que se juntar com users_roles
-Quadro e assim por diante, mas isso vai levar a duplicatas.
Alguém tem uma idéia de como fazer isso?
->propertyCondition('rid', array(1, 2, 3))
;Respostas:
Para ser sincero, não tenho idéia de como conseguir isso. É difícil encontrar bons exemplos de como usar o EntityFieldQuery. Como ninguém respondeu a essa pergunta ainda e também estou interessado na solução, tentarei ajudá-lo. Descrito abaixo é o meu melhor palpite.
Um aspecto a ter em mente: as funções são armazenadas em uma tabela diferente dos usuários. Eles são adicionados usando UserController :: attachLoad .
Parece haver três condições diferentes que você pode usar com um EntityFieldQuery:
A opção mais lógica (se houver) seria usar uma propertyCondition, mas conforme as funções são adicionadas ao usuário em UserController :: attachLoad Não acho que o EntityFieldQuery tenha acesso a ele. Eu acho que o EntityFieldQuery apenas usa o esquema definido em hook_schema ().
Isso me leva a acreditar que o que você está tentando alcançar é impossível. Uma solução alternativa seria obter todos os recursos com uma consulta normal:
Eu não tenho acesso ao Drupal agora, então o código abaixo pode estar desativado. Tenho certeza que alguém irá editar os erros.
Se for possível alcançar o que você deseja com EntityFieldQuery, eu serei esclarecido.
fonte
$uids = $result->fetchColumn()
.Deve fazer o truque
fonte
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
pode causar a coluna desconhecida 'uid'. Nesse caso, precisamos adicionar$query->propertyCondition('uid', 0, '!=')
, para que a tabela de usuários esteja na consulta.De fato, existe uma maneira de fazer isso. Em essência, o EntityFieldQuery (EFQ) é apenas uma consulta ao banco de dados que pode ser alterada com ganchos de alteração de consulta.
Exemplo mais simples possível:
No entanto, existem algumas pequenas advertências com isso que exigiriam mais codificação. Por exemplo, ao cuidar da única condição presente no EFQ ser uma fieldCondition, a tabela de base do usuário não estará presente; portanto, quando você estiver buscando usuários por função e uma única fieldCondition, também será necessário garantir que o a tabela users é ingressada e, se não, ingressar manualmente, o que é um processo meio tedioso.
Mas, para sua necessidade, isso funcionará. Perceber que você pode alterar manualmente as consultas EFQ abre um imenso mundo de oportunidades para criar consultas muito poderosas, mantendo a interface limpa e Drupal.
Entre em contato se tiver alguma dúvida ou problema.
Edit: Na verdade, encontrei uma maneira um pouco mais eficiente de fazer isso e alterei meu código de acordo.
fonte
$query
? E também posso sugerir alterarmymodule_get_users_by_rolename
para não retornar o resultado da consulta em si, mas para desreferenciar a chave'user'
.fonte
Você ainda pode usar EntityFieldQuery () depois de obter os IDs de usuário para sua função, se desejar, por exemplo, porque deseja usar o fieldCondition () ou outro método.
Usando a matriz $ uids no exemplo acima:
Seria melhor se EntityFieldQuery tivesse um método de junção.
fonte
fonte
$rolename
que seria usado na chamadauser_role_load_by_name
e uma verificação para garantiruser_role_load_by_name
que não retorne falso.OK Este é antigo, mas você pode fazer algo assim:
fonte
É um pouco tarde para o jogo, mas acho que é o que o OP estava pedindo. por exemplo, sem sql, tudo drupal. Espero que outros achem útil. A busca por isso me levou aqui e foi isso que eu criei.
fonte
Este é realmente um tópico mais antigo e eu encontrei muitas boas abordagens.
Eu melhoraria um pouco a solução fornecida pelo @alf, porque acho que uma consulta com join é a melhor abordagem. No entanto, também gosto que minhas funções tenham parâmetros e não dependam de uma constante. Então aqui vai:
fonte
Você pode encontrar bons exemplos de explicações sobre como usar o EntityFieldQuery aqui:
mas, como disse Berdir no momento, "o EFQ suporta apenas propriedades básicas de uma entidade, que fazem parte da tabela de entidades. As funções de um usuário não são expostas de forma alguma ao sistema da entidade".
fonte
Não tenho dúvida de que isso pode ser simplificado. Isso pode ser feito no drupal 8:
fonte