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 = ???

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!


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.


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



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),

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.