web-dev-qa-db-fra.com

Quelle est la bonne utilisation de EntityFieldQuery?

Dans Drupal 7, la documentation de l'API pour node_load_multiple() spécifie l'utilisation du paramètre $conditions A été déconseillée au profit de l'utilisation de EntityFieldQuery. Comment fonctionne l'un utilise la classe pour générer une liste d'ID de noeud à utiliser avec node_load_multiple()? Y a-t-il d'autres cas d'utilisation pour cela?

37
user7

EntityFieldQuery utilise un ensemble de crochets pour s'interfacer avec des modules de stockage de champs, tels que Field SQL Storage, afin de travailler pour les champs ainsi que d'autres propriétés de noeud. À long terme, EntityFieldQuery est un moyen beaucoup plus fiable d'interroger n'importe quel type d'entité, et dans certaines situations, il peut effectuer des requêtes entre entités (voir field_has_data ou _ list_values_in_use () pour un exemple.

Voici un exemple simple d'utilisation de EntityFieldQuery pour obtenir une liste de tous les nœuds publiés avant un horodatage spécifique:

$query = new EntityFieldQuery();

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

$result = $query->execute();

$ les résultats de cette requête ressembleraient à ceci:

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

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

        )

)

Vous pouvez ensuite utiliser ce tableau comme entrée de node_load_multiple:

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

J'ai trouvé un problème sur Drupal sur l'ajout d'exemples pour EntityFieldQuery. Je l'ai utilisé pour des exemples ainsi que pour exprimer mon opinion sur l'appel pour plus d'exemples.

" Avons-nous besoin d'un exemple EntityFieldQuery? "

commentaire # 11 montre l'utilisation de node_load_multiple() comme indiqué ci-dessous:

$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');
14
electblake

Voici un exemple de l'un des modules de test:

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

Cela sélectionne les nœuds dont le champ de corps commence par "A". Voir aussi EntityFieldQuery :: execute () sur la façon d'utiliser le résultat renvoyé.

Il existe de nombreux cas d'utilisation, l'exemple typique consiste à interroger des entités pour une valeur de champ spécifique, comme le champ de corps, comme indiqué dans le premier exemple.

L'avantage est qu'il fonctionne quel que soit le champ de stockage que vous utilisez. Par exemple, vous pouvez avoir vos champs dans MongoDB et EntityQuery fonctionnera toujours alors que l'interrogation manuelle de field_data_body ne le serait pas.

8
Berdir

Vous pouvez utiliser la classe EntityFieldQuery pour interroger la base de données et récupérer les résultats sous forme de liste similaire à node_load_multiple() .

Cela peut être réalisé en créant une classe, en appliquant les conditions et en exécutant la requête, par exemple:

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

Cela générera le tableau tel que:

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

Pour récupérer l'ID dans le tableau de résultats, vous pouvez utiliser: current(current($result))->tid.

Voici un exemple plus avancé:

<?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);
}
?>

Voir: Comment utiliser EntityFieldQuery sur Drupal.org pour plus d'explications.

0
kenorb