首页 > 后端开发 > php教程 > 了解Drupal的EntityFieldQuery

了解Drupal的EntityFieldQuery

Jennifer Aniston
发布: 2025-02-22 08:27:11
原创
976 人浏览过

了解Drupal的EntityFieldQuery

钥匙要点

  • > EntityFieldQuery是Drupal的一类,允许开发人员从数据库中获取有关实体的信息,而无需编写SQL查询,从而更容易检索,过滤和排序数据。当需要从多个表获取数据或要应用复杂条件到查询时,这一点特别有用。
  • >
  • >可以扩展EntityFieldQuery类以创建自己的子类,从而使您可以在多个位置构建相同的查询。例如,您可能需要构建一个查询,以以创建日期的上升顺序获得所有活跃的用户。这可以通过创建一个扩展EntityFieldQuery并设置适当条件和顺序的新类来实现。
  • >
  • > EntityFieldQuery支持各种方法,例如从特定实体类型中获取数据,``propertyCondition''用于添加基于实体属性的条件的``propertyCondition'',用于从自定义字段获取数据的fieldCondition和`forthConcondition''forthConcondition'和``fieldCondition''对结果进行排序。但是,它仅支持一次从一个实体类型中获取数据。如果您需要从多个实体类型中获取数据,则需要对每种类型运行单独的查询。>
简介

>构建复杂的Web应用程序时,您最终必须与数据库进行交互。要检索Drupal中的数据,可以使用提供的数据库抽象层,这需要正确使用一些SQL知识。提供了Drupal 7 EntityFieldQuery API,可让您在不实际构建SQL查询的情况下获取有关Drupal的实体的信息。在本文中,让我们看看如何使用EntityFieldQuery API从Drupal获取数据并在我们的模块中使用。

> ENTITYFIELDQUERY类

> EntityFieldQuery类用于在Drupal中找到符合某些条件的实体。 EntityFieldQuery在您的Drupal安装中的inclate/entity.inc文件中存在。

此类具有不同的方法来指定实体类型和基于某些条件,我们可以过滤我们要获取的数据。在本文中,我们将详细介绍这些方法。

首先,在使用EntityFieldQuery时将遵循的基本用法首先是创建此类的对象。创建对象后,您将为其添加一些条件,然后调用执行方法以获取结果。
一般模板如下
>

>我们现在将创建一个Drupal模块,该模块将安装3种新的Drupal节点类型:产品,电影和书籍以及一个将显示结果的块。您可以在本文中查看如何创建节点类型

模块的代码为
<span>$entityquery = new EntityFieldQuery();
</span><span>/// Set some conditions   
</span><span>$result = $query->execute ();</span>
登录后复制
登录后复制
登录后复制

entityquery.info >

> entityquery.install

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.module

<span>$entityquery = new EntityFieldQuery();
</span><span>/// Set some conditions   
</span><span>$result = $query->execute ();</span>
登录后复制
登录后复制
登录后复制

>将此模块放入模块文件夹中,如果一切顺利,您将能够在模块列表中看到EntityQuery模块,如下所示。

了解Drupal的EntityFieldQuery

安装模块后,您应该能够在Drupal Admin面板的“添加内容”部分中看到新的节点类型,如下所示

了解Drupal的EntityFieldQuery>使用EntityFieldQuery

执行简单查询

>我们设置了用于使用EntityFieldQuery的基本模块后,让我们开始编写一些查询以从Drupal获取数据。我们要写的第一个查询是使用EntityFieldQuery获取所有节点。然后,我们将使用它在我们的块中显示节点的标题。> 如前所述,第一件事是创建一个EFQ实例。要获取一种类型的实体,您必须向其添加Entity_Type条件。在这种情况下,我们要获取节点,以便其代码如下:>

使用我们将实体类型设置为节点的函数实体条件设置实体条件。设置实体条件后,我们就可以执行查询。节点ID在结果的节点密钥中返回。显示节点的完整代码将如下:

>

现在,如果您去看块,则应该能够看到其中的所有节点,如下所示
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>
登录后复制
登录后复制
登录后复制

<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>
登录后复制
登录后复制
>现在,您应该尝试添加不同的节点,例如电影和书籍,并检查它们在街区中显示。在以上,代码一旦我们获得了EntityFieldQuery的节点ID,我们就会使用node_load_multiple加载节点并显示它们。

>将实体条件添加到EntityFieldQuery

了解Drupal的EntityFieldQuery>您可以添加实体条件以仅显示特定类型的节点。如果我们只想从节点类型中显示“产品”,则我们将使用的查询是:>

现在,如果我们检查块,它将仅显示产品:

我们甚至可以使用EntityCondition指定一系列节点类型来获取多种类型的节点。从数据库中获取所有产品和电影:
<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>
登录后复制
登录后复制

>将属性条件添加到EntityFieldQuery

了解Drupal的EntityFieldQuery>我们甚至可以在查询中添加属性条件。这些取决于您要查询的实体类型。在大多数情况下,属性条件将在您要查询的实体类型的字段上。例如,您可以查询发布的节点,或者由特定用户编写等。

仅使用属性条件显示出已发布的节点的查询如下

>

<span>$entityquery = new EntityFieldQuery();
</span><span>/// Set some conditions   
</span><span>$result = $query->execute ();</span>
登录后复制
登录后复制
登录后复制

>将现场条件添加到EntityFieldQuery并订购

>场的条件特定于实体上存在的字段。因此,假设我们想找到所有具有折扣单词折扣的产品 - 我们可以使用现场条件进行。我们甚至可以使用propertyOrderby函数订购结果。

如果我们想要在其体内有“折扣”的产品和电影,以降序的创建顺序排列,则查询将如下:

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>
登录后复制
登录后复制
登录后复制
此查询的输出将如下

>

了解Drupal的EntityFieldQuery

扩展EntityFieldQuery类

有时,您可能必须在许多地方构建相同的查询。一种抽象的好方法,是扩展EntityFieldQuery类并创建自己的子类。

假设您想构建一个查询以按其创建日期的升级顺序获取所有活跃用户:

现在,您可以在任何地方使用此查询:

<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>
登录后复制
登录后复制

结论

Drupal中的许多模块都需要您从数据库中获取实体内容。可以直接使用Drupal数据库层,但是为此,您必须至少具有SQL的工作知识,并且可能更容易出现错误。 EntityFieldQuery类是Drupal核心的一部分,您可以轻松地使用它,而无需依赖其他模块。创建下一个Drupal模块的乐趣!
<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>
登录后复制
登录后复制
>

经常询问有关Drupal的EntityFieldQuery

的问题(常见问题解答)

>在Drupal中EntityFieldQuery的主要目的是什么?它提供了一种简单有效的方法来处理复杂的查询,从而更容易检索,过滤和排序数据。当您需要从多个表中获取数据或要在查询中应用复杂的条件时,这特别有用。

如何使用EntityFieldQuery从特定的实体类型中获取数据?要从特定实体类型中获取数据,您可以使用EntityFieldQuery类的“实体调节”方法。此方法接受两个参数:条件类型(对于这种情况,应为“ ENTITY_TYPE”)和您要从中获取数据的实体类型。以下是一个示例:

$ query = new EntityFieldQuery();

$ query-> entityCondition('entity_type','node',node');

$ usce = $ quey-> query-> execute();

>

我可以一次使用EntityFieldQuery一次从多个实体类型中获取数据吗?一次支持一次从一个实体类型中获取数据。如果您需要从多种实体类型中获取数据,则需要对每种类型进行单独的查询。>

>如何对EntityFieldQuery的结果进行分类?

>您可以使用“ fieldorderby”方法对EntityFieldQuery的结果进行分类。此方法接受三个参数:字段名称,要排序的列以及排序方向(“升级”或“降” desccenter的“ ASC”)。这是一个示例:

$ query = new EntityFieldQuery();
$ query-> entityCondition('entity_type','node'',node'>> fieldorderby('fieldOrderby('field_name'field_name'','value','value',',',',',,' 'desc');
$ result = $ query-> execute();
>我可以使用EntityFieldQuery来获取来自自定义字段的数据?

是的,您可以使用“ fieldCondition”方法从自定义字段获取数据。此方法接受三个参数:字段名称,要过滤的列以及要过滤的值。这是一个示例:

$ query = new EntityFieldQuery();
$ query-> entityCondition('entity_type','node','node'>> fieldCondition('Field_custom' '自定义值');
$ result = $ query-> execute();

>我如何限制返回的结果数通过EntityFieldQuery?

>您可以使用“范围”方法来限制EntityFieldQuery返回的结果数。此方法接受两个参数:偏移量(跳过的结果数)和限制(要返回的结果的最大数量)。以下是一个示例:

$ query = new EntityFieldQuery();

$ query-> entityCondition('entity_type','node','node')
> - > range(0,10) $ result = $ query-> execute();

>我可以使用EntityFieldQuery从具有特定状态的实体获取数据?
是的,您可以将“ EntityCondition”方法与“状态”类型类型一起从具有特定状态的实体中获取数据。以下是一个示例:

$ query = new EntityFieldQuery();

$ query-> entityCondition('entity_type','node','node'')

> - > entityCondition('status',status',1); $ result = $ query-> execute();

>我如何从具有特定捆绑包的实体获取数据ENTITYFIELDQUERY?

您可以使用“捆绑”条件类型的“ EntityCondition”方法从具有特定捆绑包的实体中获取数据。这是一个示例:
$ query = new EntityFieldQuery();

$ query-> entityCondition('entity_type','node','node')

- > entityCondition('bundle'bundle'','bundle'','acrest') ;

$结果= $ query-> execute();

>我可以使用EntityFieldQuery从实体获取数据是在特定时间创建或更新的?该方法接受三个参数:属性名称,要过滤的值以及用于比较的操作员。以下是一个示例:

$ query = new EntityFieldQuery();
$ QUERY-> entityCondition('entity_type','node','node'')

> - > propertyCondition('创建','created',strtotime(' - ' - ' - strtotime(' - ' - 1天'),'> =');

$ result = $ query-> execute();

>

>我如何使用EntityFieldQuery?

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->fieldCondition('field_multi_value', 'value', '特定值','=',1);
$ result = $ query-> execute();

以上是了解Drupal的EntityFieldQuery的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板