Obter apenas alguns campos com EntityFieldQuery?

19

O Drupal 7 possui um sistema de consultas muito promissor, semelhante ao ORM, com o EntityFieldQuery.

Atualmente, eu entendo como fazer a seleção de nós, mas o resultado não contém nenhuma informação específica, como os arquivados, que estou procurando.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

Portanto, precisamos carregar dados inteiros de nós, se quisermos obter apenas valores de um campo, por exemplo 'data_campo' no exemplo atual.

$nodes = entity_load('node', array_keys($entities['node']));

Se houver uma maneira de obter o valor dos campos, em vez disso, carregar dados completos de todos os nós, pois isso provoca uma sobrecarga de memória.

$nodesFieldDates = ???
Fedir RYKHTIK
fonte

Respostas:

10

Ótima pergunta!

EntityFieldQuery é realmente uma coisa boa, mas se você realmente quer levar a sério, precisa substituir a classe em um módulo personalizado e adicionar qualquer comportamento necessário lá.

Não conheço suas intenções exatas, mas me referi a este artigo sobre o assunto no passado. Créditos a Neil Hastings por este artigo bem escrito.

Procure exemplos de código um pouco no artigo para obter bons exemplos de substituição.

Espero que ajude, feliz codificação!

stefgosselin
fonte
OK eu vejo ! Portanto, provavelmente é possível redefinir o método "EntityFieldQuery" "buildQuery" para alternar os campos resultantes. Provavelmente, isso poderia funcionar.
Fedir RYKHTIK
11

Eu encontrei a resposta para isso! O módulo Apache Solr estende a classe EntityFieldQuery para que isso aconteça. Ele adiciona um novo método chamado addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Se você não possui o Apache Solr instalado, copie o código para estender essa classe.

mikeytown2
fonte
Criado uma caixa de areia para este como o módulo do Apache Solr teve alguns inconvenientes drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
Upvoted esta resposta simplesmente para o (atualmente sandbox) módulo criado por mikeytown2 (obrigado!)
Oliver Coleman
O link na resposta parece não funcionar. Ele diz "Você precisa fazer login ou se inscrever antes de continuar".
mbomb007 27/08
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Atualizado o link
mikeytown2
0

Quem ainda deseja obter campos de um EFQ, consulte o módulo EFQ Extra Fields .

Aviso: Este módulo abusa do EntityFieldQuery para retornar dados do seu banco de dados. Ele não funciona com entidades ou módulos que se baseiam nelas.

Ele permite que você use addField dentro de um objeto EntityFieldQueryExtraFields (estende os objetos EntityFieldQuery). Inicialmente, EntityFieldQuery fornece apenas o ID, o pacote e o tipo de entidade. Este módulo adiciona uma camada extra em cima disso sem fazer algumas entidades_loads extras! Importante se você deseja trabalhar com grandes quantidades de dados e deseja reduzir as consultas sql. Como o EFQ já consulta o banco de dados para obter essas informações, por que não alterar essa consulta para fornecer também alguns campos adicionais. Isso significa que nenhuma consulta extra será executada para obter esses dados.

Uma palavra de cautela, se você confiar em alguma pós-formatação / pós-carregamento que ocorre no entity_load ou em funções similares, este módulo não cuidará disso. Você deve garantir a validade dos dados recuperados.

Exemplo

Buscando o título do nó

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('status', 1)
  -> addExtraField ('field_myfield', valor ', valor')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'node')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> execute ();
Combinações possíveis:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

field_name
Especifique de qual campo o campo extra deve vir. Se for de uma tabela base, deixe em branco e preencha o argumento da tabela

coluna
Especifique o nome da coluna,

column_alias
Especifique o alias da coluna,

mesa
Opcionalmente, adicione algo como nó ou usuário aqui (a tabela base),
tenken
fonte
Eu tentei tanto este módulo (EFQ Extra Fields) quanto o módulo (atualmente sandbox) do mikeytown2, e o último parecia muito melhor (mais agradável de usar, saída mais sensível) e também parece ser mantido muito melhor que o anterior. O módulo sandbox mikeytown2 está em drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman