【Dupal】エンティティにアクセスする方法
はじめに
Drupalではエンティティにアクセス方法がいくつか用意されています。メモ代わりに残しておきます。
コンテンツタイプのエンティティにアクセスするには、entityTypeManagerを使用する方法とentityQueryを使用する方法があります。
一般的にentityTypeManagerがよく使用されているようです。
またentityTypeManagerを使用する場合でも、loadByPropertiesメソッド で使用してデータを抽出する方法と、クエリを直接使用する必要があるのでそちらも記載しています。
ちなみに、Drupal7まではエンティティを検索するAPIとしてEntityFieldQuery
が用意されていましたが、Drupal8から廃止されました。
https://qiita.com/863/items/111c0f73be175ed67a74
アクセスの方法
entityTypeManagerとloadByPropertiesメソッドを使用する
//entityTypeManagerを使う方法
$nodes = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties(['type' => 'scraping_api_master']);
$nids=array();
foreach ($nodes as $tid => $node) {
$nids[] = $node->id();
}
クエリー条件を直接設定する
entityTypeManagerとgetQueryメソッドを使用する
//entityTypeManagerを使う方法
$nodes = \Drupal::entityTypeManager()
->getStorage('node')
->getQuery()
->condition('type', 'scraping_api_master')
->accessCheck(FALSE)
->execute();
$nids = array_values($query);
entityQueryを使用する
//entityQueryを使う方法
$query = \Drupal::entityQuery('node')
->condition('type', 'scraping_api_master')
->accessCheck(FALSE)
->execute();
$nids = array_values($query);
QUERYの結果を以下のようにLOADMULTIPLEメソッドに入れることで、クエリー結果をすべてLOADすることができます。
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($query);
loadByProperties() は将来廃止される可能性がありますので、エンティティクエリを自分で直接実行することを強くお勧めします。
さいごに
データベースを直接操作するには、db_query()やdb_select() \Drupal::database()->select()
が用意されています。しかし、特にdb_queryを使用して不用意にSQLを直接書いてしまうとSQLインジェクションなど外部の攻撃にさらされるリスクがあります。なるべくDRUPAL APIを使用するようにしましょう。
*訂正) Drupal9以降は、db_query()とdb_select()は廃止され、\Drupal::database()->select()
に置き換わりました。
参考
この記事に関するご質問やご意見などございましたらお問い合わせフォームからお気軽にご連絡ください。