Maison >développement back-end >tutoriel php >Comprendre EntityFieldQuery de Drupal

Comprendre EntityFieldQuery de Drupal

Jennifer Aniston
Jennifer Anistonoriginal
2025-02-22 08:27:111084parcourir

Comprendre EntityFieldQuery de Drupal

Les plats clés

  • EntityFieldQuery est une classe de Drupal qui permet aux développeurs de récupérer des informations sur les entités de la base de données sans avoir à rédiger des requêtes SQL, ce qui facilite la récupération, le filtre et le trier les données. Ceci est particulièrement utile lorsque vous devez récupérer des données à partir de plusieurs tables ou lorsque vous souhaitez appliquer des conditions complexes aux requêtes.
  • La classe EntityFieldQuery peut être étendue pour créer votre propre classe d'enfants, vous permettant de construire la même requête à plusieurs endroits. Par exemple, vous pouvez créer une requête pour obtenir tous les utilisateurs actifs dans l'ordre croissant de leur date de création. Cela peut être réalisé en créant une nouvelle classe qui étend EntityFieldQuery et définit les conditions et l'ordre appropriés.
  • EntityFieldQuery prend en charge diverses méthodes telles que «EntityCondition» pour récupérer les données d'un type d'entité spécifique, «PropertyCondition» pour ajouter des conditions basées sur les propriétés de l'entité, «FieldCondition» pour récupérer les données des champs personnalisés et «PropertyOrderBy» tri les résultats. Cependant, il ne prend en charge que la récupération des données d'un type d'entité à la fois. Si vous devez récupérer des données à partir de plusieurs types d'entités, vous devrez exécuter des requêtes distinctes pour chaque type.

Introduction

Lors de la création d'applications Web complexes, vous devrez éventuellement interagir avec une base de données. Pour récupérer des données dans Drupal, on peut utiliser la couche d'abstraction de la base de données fournie, ce qui nécessite que certaines connaissances SQL soient utilisées correctement. De Drupal 7 EntityFieldQuery, l'API est fournie, ce qui vous permet de récupérer des informations sur les entités de Drupal sans créer des requêtes SQL. Dans cet article, voyons comment nous pouvons utiliser l'API EntityFieldQuery pour récupérer les données de Drupal et l'utiliser dans nos modules.

La classe EntityFieldQuery

La classe EntityFieldQuery est utilisée pour trouver des entités à Drupal, qui correspondent à certaines conditions. L'EtityFieldQuery est présent dans le fichier inclue / entity.inc dans votre installation Drupal.
Cette classe a différentes méthodes pour spécifier le type d'entité et certaines conditions en fonction de laquelle nous pouvons filtrer les données que nous voulons récupérer. Nous verrons ces méthodes en détail tout au long de cet article.
L'utilisation de base, que vous suivrez en utilisant EntityFieldQuery sera, avant tout, créer un objet de cette classe. Une fois l'objet créé, vous y ajouterez des conditions, puis appellerez la méthode d'exécution pour récupérer les résultats.

Le modèle général est le suivant

<span>$entityquery = new EntityFieldQuery();
</span><span>/// Set some conditions   
</span><span>$result = $query->execute ();</span>

Nous allons maintenant créer un module Drupal qui installera 3 nouveaux types de nœuds Drupal: produit, films et livres et un bloc dans lequel nous afficherons nos résultats. Vous pouvez voir comment créer un type de nœud dans cet article

Le code du module est

EntityQuery.info

name <span>= entityquery
</span>description <span>= Shows how to use entity query to fetch data from drupal
</span>package <span>= Entity Query Example
</span>core <span>= 7.x</span>

EntityQuery.install

<span><span><?php </span></span><span><span>/**
</span></span><span><span> * Implement hook_install().
</span></span><span><span> */
</span></span><span><span>function entityquery_install() {
</span></span><span>    <span>node_types_rebuild();
</span></span><span>    <span>$types = node_type_get_types();
</span></span><span>    <span>node_add_body_field($types['product']);
</span></span><span>    <span>node_add_body_field($types['movies']);
</span></span><span>    <span>node_add_body_field($types['books']);
</span></span><span><span>}</span></span></span>

EntityQuery.Module

<span>$entityquery = new EntityFieldQuery();
</span><span>/// Set some conditions   
</span><span>$result = $query->execute ();</span>

Mettez ce module dans votre dossier de modules et si tout s'est bien passé, vous pourrez voir le module EntityQuery dans votre liste de modules comme indiqué ci-dessous.

Comprendre EntityFieldQuery de Drupal

Une fois que vous avez installé le module, vous devriez être en mesure de voir les nouveaux types de nœuds également dans la section de contenu ADD de votre panneau d'administration Drupal comme suit

Comprendre EntityFieldQuery de Drupal

Exécution d'une requête simple à l'aide d'entityFieldQuery

Une fois que le module de base est configuré pour utiliser entityFieldQuery, commençons à écrire des requêtes pour récupérer les données de Drupal. La première requête que nous écrivons est d'obtenir tous les nœuds en utilisant EntityFieldQuery. Ensuite, nous l'utiliserons pour afficher les titres des nœuds dans notre bloc.

Comme indiqué précédemment, la première chose à faire est de créer une instance d'Efq. Pour récupérer un type d'entité, vous devez y ajouter la condition Entity_Type. Dans ce cas, nous voulons récupérer les nœuds afin que le code de ce soit le suivant:

name <span>= entityquery
</span>description <span>= Shows how to use entity query to fetch data from drupal
</span>package <span>= Entity Query Example
</span>core <span>= 7.x</span>

La condition d'entité est définie en utilisant la fonction de fonction de fonction dans laquelle nous définissons le type d'entité comme nœud. Une fois que nous avons défini la condition d'entité, nous sommes prêts à exécuter la requête. Les ID de nœud sont renvoyés dans un tableau dans la clé de nœud du résultat. Le code complet pour afficher les nœuds sera le suivant:

<span><span><?php </span></span><span><span>/**
</span></span><span><span> * Implement hook_install().
</span></span><span><span> */
</span></span><span><span>function entityquery_install() {
</span></span><span>    <span>node_types_rebuild();
</span></span><span>    <span>$types = node_type_get_types();
</span></span><span>    <span>node_add_body_field($types['product']);
</span></span><span>    <span>node_add_body_field($types['movies']);
</span></span><span>    <span>node_add_body_field($types['books']);
</span></span><span><span>}</span></span></span>

Maintenant, si vous allez voir votre bloc, vous devriez pouvoir y voir tous les nœuds comme suit

Comprendre EntityFieldQuery de Drupal

Vous devriez maintenant essayer d'ajouter différents nœuds comme les films et les livres et les vérifier affichés dans le bloc. Dans ce qui précède, code une fois que nous avons les ID de nœud de EntityFieldQuery, nous chargeons les nœuds à l'aide de Node_load_Multiple et les affichons.

Ajout de conditions d'entité à EntityFieldQuery

Vous pouvez ajouter des conditions d'entité pour afficher uniquement des types de nœuds particuliers. Si nous voulons afficher uniquement les «produits» à partir du type de nœuds, la requête que nous utiliserons est:

<span><span><?php </span></span><span><span>/**
</span></span><span><span> * Implement hook_node_info()
</span></span><span><span> */
</span></span><span><span>function entityquery_node_info() {
</span></span><span>    <span>return array(
</span></span><span>        <span>'product' => array(
</span></span><span>            <span>'name' => t('Product'),
</span></span><span>            <span>'base' => 'product',
</span></span><span>            <span>'description' => t('You can define new Products here'),
</span></span><span>            <span>'has_title' => TRUE,
</span></span><span>            <span>'title_label' => t('Product title')
</span></span><span>         <span>),
</span></span><span>        <span>'movies' => array(
</span></span><span>            <span>'name' => t('Movies'),
</span></span><span>            <span>'base' => 'movies',
</span></span><span>            <span>'description' => t('You can define new Movies here'),
</span></span><span>            <span>'has_title' => TRUE,
</span></span><span>            <span>'title_label' => t('Movie title')
</span></span><span>         <span>),
</span></span><span>        <span>'books' => array(
</span></span><span>            <span>'name' => t('Books'),
</span></span><span>            <span>'base' => 'Books',
</span></span><span>            <span>'description' => t('You can define new Books here'),
</span></span><span>            <span>'has_title' => TRUE,
</span></span><span>            <span>'title_label' => t('Books title')
</span></span><span>         <span>)
</span></span><span>    <span>);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_form()
</span></span><span><span> */
</span></span><span><span>function product_form($node, $form_state) {
</span></span><span>    <span>return node_content_form($node, $form_state);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_form()
</span></span><span><span> */
</span></span><span><span>function movies_form($node, $form_state) {
</span></span><span>    <span>return node_content_form($node, $form_state);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_form()
</span></span><span><span> */
</span></span><span><span>function books_form($node, $form_state) {
</span></span><span>    <span>return node_content_form($node, $form_state);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_block_info().
</span></span><span><span> */
</span></span><span><span>function entityquery_block_info() {
</span></span><span>  <span>$blocks = array();
</span></span><span>
</span><span>  <span>$blocks['entityqueryblock'] = array(
</span></span><span>    <span>'info' => t('A block to display results from entityquery'),
</span></span><span>  <span>);
</span></span><span>
</span><span>  <span>return $blocks;
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_block_view().
</span></span><span><span> */
</span></span><span><span>function entityquery_block_view($block_name = '') {
</span></span><span>  <span>if ($block_name == 'entityqueryblock') {
</span></span><span>    <span>$content ='';
</span></span><span>    <span>$block = array(
</span></span><span>      <span>'subject' => t('A block to display results from entityquery'),
</span></span><span>      <span>'content' => $content,
</span></span><span>    <span>);
</span></span><span>    <span>return $block;
</span></span><span>  <span>}
</span></span><span><span>}</span></span></span>

Maintenant, si nous vérifions notre bloc, il affichera uniquement les produits:

Comprendre EntityFieldQuery de Drupal

Nous pouvons même spécifier un tableau de types de nœuds pour récupérer plusieurs types de nœuds à l'aide de l'entité. Pour récupérer tous les produits et films de votre base de données:

<span>$query = new EntityFieldQuery();
</span><span>$query->entityCondition('entity_type', 'node');</span>

ajoutant des conditions de propriété à EntityFieldQuery

Nous pouvons même ajouter des conditions de propriété à la requête. Ceux-ci dépendraient du type d'entité pour lequel vous interrogez. Dans la plupart des cas, la condition de propriété sera sur les champs du type d'entité pour lequel vous interrogez. Vous pouvez, par exemple, une requête pour les nœuds qui sont publiés, ou être écrits par un utilisateur particulier, etc.

La requête pour afficher uniquement les nœuds publiés à l'aide de PropertyCondition est le suivant

<span>$entityquery = new EntityFieldQuery();
</span><span>/// Set some conditions   
</span><span>$result = $query->execute ();</span>

ajoutant des conditions de champ à EntityFieldQuery et commande

Les conditions de champ sont spécifiques aux champs présents sur l'entité. Supposons donc que nous voulons trouver tous les produits qui ont le mot rabais dans leur corps - nous pouvons le faire en utilisant la condition sur le terrain. Nous pouvons même commander les résultats en utilisant la fonction PropertyOrderBy.

Si nous voulons les produits et les films qui ont une «remise» dans leur corps, organisé par ordre décroissant de leur création, la requête sera la suivante:

name <span>= entityquery
</span>description <span>= Shows how to use entity query to fetch data from drupal
</span>package <span>= Entity Query Example
</span>core <span>= 7.x</span>

La sortie de cette requête sera la suivante

Comprendre EntityFieldQuery de Drupal

Extension de la classe EntityFieldQuery

Parfois, vous devrez peut-être construire la même requête dans de nombreux endroits. Un bon moyen de résumer qui serait d'étendre la classe EntityFieldQuery et de créer votre propre classe d'enfants.

Supposons que vous souhaitiez créer une requête pour obtenir tous les utilisateurs actifs dans l'ordre croissant de leur date de création:

<span><span><?php </span></span><span><span>/**
</span></span><span><span> * Implement hook_install().
</span></span><span><span> */
</span></span><span><span>function entityquery_install() {
</span></span><span>    <span>node_types_rebuild();
</span></span><span>    <span>$types = node_type_get_types();
</span></span><span>    <span>node_add_body_field($types['product']);
</span></span><span>    <span>node_add_body_field($types['movies']);
</span></span><span>    <span>node_add_body_field($types['books']);
</span></span><span><span>}</span></span></span>

Maintenant, vous pouvez utiliser cette requête n'importe où comme tel:

<span><span><?php </span></span><span><span>/**
</span></span><span><span> * Implement hook_node_info()
</span></span><span><span> */
</span></span><span><span>function entityquery_node_info() {
</span></span><span>    <span>return array(
</span></span><span>        <span>'product' => array(
</span></span><span>            <span>'name' => t('Product'),
</span></span><span>            <span>'base' => 'product',
</span></span><span>            <span>'description' => t('You can define new Products here'),
</span></span><span>            <span>'has_title' => TRUE,
</span></span><span>            <span>'title_label' => t('Product title')
</span></span><span>         <span>),
</span></span><span>        <span>'movies' => array(
</span></span><span>            <span>'name' => t('Movies'),
</span></span><span>            <span>'base' => 'movies',
</span></span><span>            <span>'description' => t('You can define new Movies here'),
</span></span><span>            <span>'has_title' => TRUE,
</span></span><span>            <span>'title_label' => t('Movie title')
</span></span><span>         <span>),
</span></span><span>        <span>'books' => array(
</span></span><span>            <span>'name' => t('Books'),
</span></span><span>            <span>'base' => 'Books',
</span></span><span>            <span>'description' => t('You can define new Books here'),
</span></span><span>            <span>'has_title' => TRUE,
</span></span><span>            <span>'title_label' => t('Books title')
</span></span><span>         <span>)
</span></span><span>    <span>);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_form()
</span></span><span><span> */
</span></span><span><span>function product_form($node, $form_state) {
</span></span><span>    <span>return node_content_form($node, $form_state);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_form()
</span></span><span><span> */
</span></span><span><span>function movies_form($node, $form_state) {
</span></span><span>    <span>return node_content_form($node, $form_state);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_form()
</span></span><span><span> */
</span></span><span><span>function books_form($node, $form_state) {
</span></span><span>    <span>return node_content_form($node, $form_state);
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_block_info().
</span></span><span><span> */
</span></span><span><span>function entityquery_block_info() {
</span></span><span>  <span>$blocks = array();
</span></span><span>
</span><span>  <span>$blocks['entityqueryblock'] = array(
</span></span><span>    <span>'info' => t('A block to display results from entityquery'),
</span></span><span>  <span>);
</span></span><span>
</span><span>  <span>return $blocks;
</span></span><span><span>}
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Implement hook_block_view().
</span></span><span><span> */
</span></span><span><span>function entityquery_block_view($block_name = '') {
</span></span><span>  <span>if ($block_name == 'entityqueryblock') {
</span></span><span>    <span>$content ='';
</span></span><span>    <span>$block = array(
</span></span><span>      <span>'subject' => t('A block to display results from entityquery'),
</span></span><span>      <span>'content' => $content,
</span></span><span>    <span>);
</span></span><span>    <span>return $block;
</span></span><span>  <span>}
</span></span><span><span>}</span></span></span>

Conclusion

De nombreux modules de Drupal auront besoin de vous pour récupérer le contenu de l'entité de la base de données. On peut directement utiliser la couche de base de données Drupal, mais pour cela, vous devez avoir au moins une connaissance pratique de SQL et cela pourrait être plus sujet aux erreurs. La classe EntityFieldQuery fait partie du noyau de Drupal et vous pouvez facilement l'utiliser sans dépendance à d'autres modules. Amusez-vous à créer votre prochain module Drupal!

Les questions fréquemment posées (FAQ) sur EntityFieldQuery de Drupal

Quel est le but principal de EntityFieldQuery dans Drupal?

EntityFieldQuery est une classe de Drupal qui vous permet de récupérer des informations sur les entités de la base de données sans écrire des requêtes SQL. Il fournit un moyen simple et efficace de gérer les requêtes complexes, ce qui facilite la récupération, le filtre et la trier les données. Il est particulièrement utile lorsque vous devez récupérer des données à partir de plusieurs tables ou lorsque vous souhaitez appliquer des conditions complexes à vos requêtes.

Comment puis-je utiliser EntityFieldQuery pour récupérer les données à partir d'un type d'entité spécifique?

Pour récupérer les données à partir d'un type d'entité spécifique, vous pouvez utiliser la méthode «EntityCondition» de la classe EntityFieldQuery. Cette méthode accepte deux paramètres: le type de condition (qui devrait être «Entity_Type» pour ce cas) et le type d'entité dont vous souhaitez récupérer des données. Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'node');
$ result = $ query-> execute ();

Puis-je utiliser EntityFieldQuery pour récupérer les données à partir de plusieurs types d'entités à la fois?

Non, EntityFieldQuery uniquement prend en charge la récupération des données d'un type d'entité à la fois. Si vous devez récupérer des données à partir de plusieurs types d'entités, vous devrez exécuter des requêtes distinctes pour chaque type.

Comment puis-je trier les résultats d'une entityFieldQuery?

Vous pouvez utiliser la méthode «FieldOrderBy» pour trier les résultats d'une EntityFieldQuery. Cette méthode accepte trois paramètres: le nom du champ, la colonne à trier et la direction de tri (soit «ASC» pour ascendant ou «desc» pour la descendance). Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'Node')
-> fieldOrderBy ('Field_name', 'Value', 'Desc');
$ result = $ query-> execute ();

Puis-je utiliser entityFieldQuery pour récupérer Les données des champs personnalisés?

Oui, vous pouvez utiliser la méthode «FieldCondition» pour récupérer les données à partir de champs personnalisés. Cette méthode accepte trois paramètres: le nom du champ, la colonne à filtrer et la valeur avec qui filtrer. Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'Node')
-> FieldCondition ('Field_Custom', 'Value', 'valeur personnalisée');
$ result = $ query-> execute ();

comment puis-je limiter le nombre de résultats renvoyés Par un entityFieldQuery?

Vous pouvez utiliser la méthode «plage» pour limiter le nombre de résultats renvoyés par un EntityFieldQuery. Cette méthode accepte deux paramètres: le décalage (le nombre de résultats à sauter) et la limite (le nombre maximum de résultats à retourner). Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'Node')
-> Range (0, 10);
$ result = $ query-> execute ();

Puis-je utiliser EntityFieldQuery pour récupérer les données des entités qui ont un statut spécifique?

Oui, vous pouvez utiliser la méthode «EntityCondition» avec le type de condition «Statut» pour récupérer les données des entités qui ont un statut spécifique. Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'Node')
-> EntityCondition ('Status', 1);
$ result = $ query-> execute ();

comment puis-je récupérer les données des entités qui ont un bundle spécifique en utilisant EntityFieldQuery?

Vous pouvez utiliser la méthode «EntityCondition» avec le type de condition «bundle» pour récupérer les données des entités qui ont un bundle spécifique. Voici un exemple:

$ query = new EntityFieldQuery ();
$ Query-> EntityCondition ('Entity_Type', 'Node')
-> EntityCondition ('bundle', 'Article') ;
$ result = $ query-> execute ();

Puis-je utiliser entityFieldQuery pour récupérer les données des entités qui ont été créés ou mis à jour à un moment précis?

Oui, vous pouvez utiliser la méthode «PropertyCondition» pour récupérer les données des entités qui ont été créées ou mises à jour à un moment précis. Cette méthode accepte trois paramètres: le nom de la propriété, la valeur avec qui filtrer et l'opérateur à utiliser pour la comparaison. Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'Node')
-> PropertyCondition ('Created', StrtoTime ('- 1 jour '),'> = ');
$ result = $ query-> execute ();

Comment puis-je récupérer des données à partir d'entités qui ont une valeur spécifique dans un champ multi-valeurs à l'aide d'entityFieldQuery?

Vous pouvez utiliser la méthode 'FieldCondition' avec la colonne 'Delta' pour récupérer les données des entités qui avoir une valeur spécifique dans un champ multi-valeurs. Voici un exemple:

$ query = new EntityFieldQuery ();
$ query-> EntityCondition ('Entity_Type', 'Node')
-> FieldCondition ('Field_Multi_Value', 'Value', 'Valeur spécifique', '=', 1);
$ result = $ query-> EXECUTE ();

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn