ホームページ >バックエンド開発 >PHPチュートリアル >Drupalの理解を理解するエンティティフィールドクリー

Drupalの理解を理解するエンティティフィールドクリー

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-22 08:27:11982ブラウズ

Drupalの理解を理解するエンティティフィールドクリー

キーテイクアウト

  • EntityFieldQueryはDrupalのクラスであり、開発者がSQLクエリを記述せずにデータベースからエンティティに関する情報を取得できるようにし、データの取得、フィルタリング、ソートを容易にします。これは、複数のテーブルからデータを取得する必要がある場合、または複雑な条件をクエリに適用したい場合に特に便利です。
  • EntityFieldQueryクラスを拡張して独自のChildクラスを作成し、複数の場所で同じクエリを構築できるようにすることができます。たとえば、すべてのアクティブユーザーを作成日の昇順ですべてのアクティブユーザーに取得するためのクエリを作成することをお勧めします。これは、EntityFieldQueryを拡張し、適切な条件と順序を設定する新しいクラスを作成することで実現できます。 EntityFieldQueryは、特定のエンティティタイプからデータを取得するための「EntityCondition」、エンティティのプロパティに基づく条件を追加するための「プロパティコンディション」、カスタムフィールドからのデータを取得するための「フィールドコンディション」などのさまざまな方法をサポートしています。結果のソート。ただし、1つのエンティティタイプからのデータの取得のみを一度にサポートします。複数のエンティティタイプからデータを取得する必要がある場合は、各タイプの個別のクエリを実行する必要があります。
  • はじめに
  • 複雑なWebアプリを構築する場合、最終的にはデータベースと対話する必要があります。 Drupalでデータを取得するには、提供されたデータベース抽象化レイヤーを使用できます。これには、SQLの知識を適切に使用する必要があります。 Drupal 7からEntityFieldQuery APIが提供されます。これにより、実際にSQLクエリを構築することなく、Drupalからエンティティに関する情報を取得できます。この記事では、EntityFieldQuery APIを使用してDrupalからデータを取得し、モジュールで使用する方法を見てみましょう。
EntityFieldQueryクラス

EntityFieldQueryクラスは、一部の条件に一致するDrupalでエンティティを見つけるために使用されます。 EntityFieldQueryは、drupalインストールのinclude/entity.incファイルに存在します。

このクラスには、エンティティタイプを指定するさまざまな方法と、どのデータを取得するかをフィルタリングできる特定の条件があります。この記事を通してこれらの方法を詳細に確認します。

EntityFieldQueryの使用中に従う基本的な使用法は、何よりもまずこのクラスのオブジェクトを作成します。オブジェクトが作成されたら、それにいくつかの条件を追加し、実行方法を呼び出して結果を取得します。

一般的なテンプレートは次のとおりです


これで、製品、映画、本の3つの新しいDrupalノードタイプ、および結果を表示するブロックをインストールする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の理解を理解するエンティティフィールドクリーモジュールをインストールしたら、次のように、Drupal管理パネルの追加セクションに新しいノードタイプも表示できるはずです

EntityFieldQueryを使用して簡単なクエリを実行しますDrupalの理解を理解するエンティティフィールドクリー

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>

映画や本などのさまざまなノードを追加して、ブロックに表示されていることを確認する必要があります。上記のコードでは、EntityFieldQueryからノードIDを使用したら、node_load_multipleを使用してノードをロードして表示します。 エンティティフィールドクリーにエンティティ条件を追加する
<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の理解を理解するエンティティフィールドクリー

エンティティコンディションを使用して複数のタイプのノードを取得するために、ノードタイプの配列を指定することもできます。データベースからすべての製品と映画を取得するには:

EntityFieldQueryにプロパティ条件を追加
<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>

クエリにプロパティ条件を追加することもできます。これらは、クエリしているエンティティタイプに依存します。ほとんどの場合、プロパティ条件は、あなたがクエリしているエンティティタイプのフィールドにあります。たとえば、特定のユーザーなどによって公開されている、または書かれているノードのクエリができます。

PropertyConditionを使用して公開されたノードのみを表示するクエリは次のとおりです

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

EntityFieldQueryクラスの拡張Drupalの理解を理解するエンティティフィールドクリー

時々、多くの場所で同じクエリを構築する必要があるかもしれません。エンティティフィールドクリークラスを拡張し、独自の子供クラスを作成することです。

作成日の昇順ですべてのアクティブユーザーを取得するためにクエリを作成するとします:

これで、このクエリをどこでも使用できます。

<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モジュールを作成して楽しんでください! DrupalのEntityFieldQuery
<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>
に関するよくある質問(FAQ)

DrupalのEntityFieldQueryの主な目的は何ですか?

エンティフィールドクリーを使用して特定のエンティティタイプからデータを取得するにはどうすればよいですか?特定のエンティティタイプからデータを取得するには、EntityFieldQueryクラスの「EntityCondition」メソッドを使用できます。このメソッドは、2つのパラメーターを受け入れます。条件タイプ(このケースの「entity_type」)と、データを取得するエンティティタイプです。例は次のとおりです。

$ query = new entityfieldquery();

$ query-> entitycondition( 'entity_type'、 'node');

$ result = $ query-> execute();

EntityFieldQueryを使用して、複数のエンティティタイプから一度にデータを取得できますか?一度に1つのエンティティタイプからデータの取得をサポートします。複数のエンティティタイプからデータを取得する必要がある場合は、各タイプの個別のクエリを実行する必要があります。$ query = new entityfieldquery();

$ query-> entitycondition( 'entity_type'、 'node')
- > fieldOrderby( 'field_name'、 'value'、 'desc');
$ result = $ query-> execute();

entityfieldqueryを使用してフェッチできますかカスタムフィールドからのデータ?

はい、「フィールドコンディション」メソッドを使用して、カスタムフィールドからデータを取得できます。このメソッドは、フィールド名、フィルターする列、およびフィルタリングする値の3つのパラメーターを受け入れます。例は次のとおりです。

$ query = new entityfieldquery();

$ query-> entitycondition( 'entity_type'、 'node')
- > fieldcondition( 'field_custom'、 'value'、 'Custom Value');
$ result = $ query-> execute();

結果の数を制限するにはどうすればよいですかEntityFieldQueryによって返されますか?

$ query = new EntityFieldQuery();

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

- > range(0、10);

$ result = $ query-> execute();

entityfieldqueryを使用して、特定のステータスを持つエンティティからデータを取得できますか?
はい、「ステータス」条件タイプの「エンティティコンディション」メソッドを使用して、特定のステータスを持つエンティティからデータを取得できます。例は次のとおりです。

$ query = new entityfieldquery();

$ query-> entitycondition( 'entity_type'、 'node')

- > entitycondition( 'status'、1);

$ result = $ query-> execute();


特定のバンドルを使用しているエンティティからデータを取得するにはどうすればよいですかEntityFieldQuery?
「バンドル」条件タイプの「EntityCondition」メソッドを使用して、特定のバンドルを持つエンティティからデータを取得できます。例は次のとおりです。

$ query = new entityfieldquery();

$ query-> entitycondition( 'entity_type'、 'node')

- > entitycondition( 'bundle'、 'article') ;

$ result = $ query-> execute();


entityfieldqueryを使用してエンティティからデータを取得できますか特定の時間に作成または更新されましたか?このメソッドは、プロパティ名、フィルタリング値、および比較に使用する演算子の3つのパラメーターを受け入れます。例は次のとおりです。

$ query = new entityfieldquery();
$ query-> entitycondition( 'entity_type'、 'node')
- > propetycondition( 'created'、strtotime( ' - 1 day ')、'> = ');

$ result = $ query-> execute();

「Delta」列を使用して「FieldCondition」メソッドを使用して、エンティティからデータを取得できます。多価フィールドに特定の値を持っています。例は次のとおりです。


$ query = new entityfieldquery();
$ query-> entitycondition( 'entity_type'、 'node')
- > fieldcondition( 'field_multi_value'、 'value'、 「特定の値」、 '='、1);
$ result = $ query-> execute();

以上がDrupalの理解を理解するエンティティフィールドクリーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。