it-swarm-eu.dev

Jaké je správné použití EntityFieldQuery?

V Drupal 7) dokumentace API pro node_load_multiple() specifikuje pomocí parametru $conditions Byla zastarána ve prospěch použití EntityFieldQuery. jeden použije třídu pro vygenerování seznamu ID uzlů pro použití s ​​node_load_multiple()? Existují nějaké další případy použití?

37
user7

EntityFieldQuery používá sadu háčků k propojení s moduly úložiště pole, jako je například pole SQL Storage, aby pracovalo pro pole i další vlastnosti uzlu. Dlouhodobě je EntityFieldQuery mnohem spolehlivější způsob dotazování na jakýkoli typ entity av některých situacích může provádět dotazy na více entit (viz field_has_data nebo _ list_values_in_use () pro příklad.

Zde je jednoduchý příklad použití EntityFieldQuery k získání seznamu všech uzlů publikovaných před konkrétním časovým razítkem:

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

$ výsledky z tohoto dotazu by vypadaly asi takto:

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

Toto pole byste pak mohli použít jako vstup pro node_load_multiple:

$nodes = node_load_multiple(array_keys($result['node']));
36
Mikey P

Našel jsem problém v otázce Drupal o přidávání příkladů pro EntityFieldQuery. Použil jsem jej jako příklady a také abych vyjádřil svůj názor na výzvu pro další příklady.

" Potřebujeme příklad EntityFieldQuery? "

komentář # 11 ukazuje použití node_load_multiple(), jak je vidět níže:

$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();

$nodes = entity_load('node', array_keys($entities['node']));
return node_view_multiple($nodes, 'teaser');
15
electblake

Zde je příklad jednoho z testovacích modulů:

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

Tím vyberete uzly, jejichž pole těla začíná písmenem „A“. Viz také EntityFieldQuery :: execute () , jak používat vrácený výsledek.

Existuje mnoho případů použití, typickým příkladem je dotazování entit na konkrétní hodnotu pole, jako je pole těla, jak je ukázáno v prvním příkladu.

Výhodou je, že funguje bez ohledu na to, kterou field_storage používáte. Například můžete mít svá pole v MongoDB a EntityQuery bude stále fungovat, zatímco dotazování field_data_body ručně nebude.

9
Berdir

Třídu EntityFieldQuery můžete použít k dotazování do databáze a načtení výsledků ve formě seznamu podobného node_load_multiple() .

Toho lze dosáhnout vytvořením třídy, použitím podmínek a provedením dotazu, například:

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

Toto vygeneruje pole jako:

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

K načtení ID z výsledného pole můžete použít: current(current($result))->tid.

Zde je podrobnější příklad:

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year . '%', 'like')
  ->fieldOrderBy('field_photo', 'fid', 'DESC')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // Run the query as user 1.

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
?>

Viz: Jak používat EntityFieldQuery na Drupal.org pro další vysvětlení.

0
kenorb