指定されたタイプのすべてのノードを取得します


21

Drupal 8my_custom_typeタイプのすべてのノードを取得したいと思います。

ですべてのノード(すべてのタイプ)を取得し、\Drupal\node\Entity\Node::loadMultiple()すべてのタイプのリストを取得できることを知ってい\Drupal\node\Entity\NodeType::loadMultiple()ます。

しかし、特定のノードタイプのノードのみを取得する方法は?

専用のモジュールを(可能な場合は)使用したくないので、できるだけ単純にしておきます。カスタムモジュールでソリューションを使用します。

そして、すべてのノードをロードし\Drupal\node\Entity\Node::loadMultiple()てからタイプをチェックインするとforeach、パフォーマンスが大幅に低下します。

回答:


39

Drupal::entityQuery()Node::loadMultiple()を使用して、指定したタイプのすべてのノードをロードできます。

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);

1
任意のエンティティタイプに対してこれを一般的に行う方法はありますか?\ Drupal :: entityQuery($ type)-> condition( 'type'、$ bundle)> execute();と思うでしょう。動作しますが、悲しいことにいいえ。
liquidcms

1
この回答は、ノードエンティティに固有のものです。他のエンティティの詳細は変更されます。一般的なケースについては別の質問をする必要があります。
ショーンコン

3
OOPコードでは、これはになりました$nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();drupal.org/node/2849874を参照してください。
レイマンクス

17

これを行う別の方法は、次のコードスニペットを使用することです。

$values = [
  'type' => 'page'
];
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties($values);

7

通常、すべてではなく、公開されたノードが必要です。

$nids = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'YOUR-NODE-TYPE')
  ->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);

7

実際には非常に簡単です

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type', 'status' => 1])

すべてのノードも非公開にする場合は、次を使用します。

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type'])

0

かつて、ドキュメントを見つけて見つけるのはかなり簡単だったものが、かなり複雑で見つけにくいものになりました。これはこのトピックの上位の検索結果の1つであるため、新しいメソッドを使用してまとめたソリューションを投稿するのに時間をかけたいと思います。

私のユースケースは、特定のコンテンツタイプの公開されたノードのリストを取得し、それらをサードパーティが使用するXMLとしてページに公開することです。

これが私の宣言です。それらのいくつかはこの時点では不必要かもしれませんが、私はまだコードをアップグレードしていません。

<?php
namespace Drupal\my_events_feed\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Component\Serialization;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Response;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Entity\EntityTypeManager;

オブジェクトをXMLにフィードするコードは次のとおりです。

/**
 * Class BuildXmlController.
 */
class BuildXmlController extends ControllerBase {
  /**
   * Builds the xml from an object
   */
  public function build() {
    $my_events = \Drupal::entityTypeManager()
    ->getStorage('node')
    ->loadByProperties([
      'status' => '1',
      'type' => 'submit_an_event',
    ]);

    $thisSerializer = \Drupal::service('serializer');
    $serializedData = $thisSerializer->serialize($my_events, 'xml', ['plugin_id' => 'entity']);

    $response = new Response();
    $response->headers->set('Content-Type', 'text/xml');
    $response->setContent($serializedData);
    return $response;
  }
}

データを処理する必要がある場合は、配列を埋めて編集する必要があります。もちろん、標準ライブラリアレイをシリアル化することもできます。

/**
 * Class BuildXmlController.
 */
class BuildXmlController extends ControllerBase {
  /**
   * Builds the xml from an array
   */
  public function build() {

    $my_events = \Drupal::entityTypeManager()
    ->getStorage('node')
    ->loadByProperties([
      'status' => '1',
      'type' => 'submit_an_event',
    ]);

    $nodedata = [];
    if ($my_events) {
      /*
      Get the details of each node and
      put it in an array.
      We have to do this because we need to manipulate the array so that it will spit out exactly the XML we want
       */
      foreach ($my_events as $node) {
        $nodedata[] = $node->toArray();
      }
    }

    foreach ($nodedata as &$nodedata_row) {
      /* LOGIC TO MESS WITH THE ARRAY GOES HERE */
    }

    $thisSerializer = \Drupal::service('serializer');
    $serializedData = $thisSerializer->serialize($nodedata, 'xml', ['plugin_id' => 'entity']);

    $response = new Response();
    $response->headers->set('Content-Type', 'text/xml');
    $response->setContent($serializedData);
    return $response;
  }
}

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.