web-dev-qa-db-ja.com

特定の用語を持つノードを選択するdb_select()

これは簡単な質問であるはずなので、以前に回答済みですが、他のStackexchangeの回答のすべてが(少なくとも私が理解できる限り)質問に直接回答していないようです。

_$query = db_select('node', 'n')
      ->fields('n', array('nid', 'title', 'created'))
      ->condition('status', 1)
      ->condition('type', 'photo_gallery')
      ->orderBy('created', 'DESC')
      ->execute();
_

これは、ノードのリストを取得するためのdb_select()です。

私の_photo_gallery_コンテンツタイプには、tags分類を参照する_field_tags_という名前の用語参照フィールドもあります。

データベースからノードのリストを選択し、特定のタグを持つノードのみを取得するにはどうすればよいですか?

1
Kenny Wyland

Joinステートメントを使用する必要があります。基本的に必要なことは、クエリを別のテーブルの別のクエリと結合することです。

これが使用できる例です。

$query = db_select('file_managed', 'fm');
$query->join('field_data_field_image', 'fi', 'fm.fid = fi.field_image_fid');
$query->groupBy('fm.fid');
$query->fields('fm', array('filename', 'uri'));
$query->fields('fi', array('field_image_width', 'field_image_height'));
$query->condition('fi.bundle','image_for_slider','=');
$result = $query->execute()->fetchAssoc();

この例では、file_managedテーブルがfield_data_field_imageと結合されています。それらをnodeとfield_tagsで切り替える必要があります。

3
saadlulu

saadluluの答えも正しいですが、それは分類用語のトピックを具体的に扱っていないので、私がほんの数分前に作業した私の解決策を投稿し、何が起こっているのか説明して、一緒に来る他の初心者が理解できるようにします自分の用途のためにそれを変更するのに十分にうまく起こっていること。

私のノードのタイプはphoto_galleryで、field_tagsという分類用語フィールドがあり、$term_idの用語が含まれるすべてのノードを取得したい

$query = db_select('node', 'n');
$query->join('field_data_field_tags', 't', 't.entity_id=n.nid');
$result = $query
  ->fields('n', array('nid', 'title', 'created'))
  ->fields('t', array('entity_type', 'bundle', 'field_tags_tid', 'entity_id'))
  ->condition('entity_type', 'node')
  ->condition('bundle', 'photo_gallery')
  ->condition('field_tags_tid', $term_id)
  ->condition('status', 1)
  ->condition('type', 'photo_gallery')
  ->orderBy('created', 'DESC')
  ->execute();

私が知りませんでした/理解できなかったのは、用語参照などの背後でテーブルがどのように構成されているかです。実際のSQLテーブルを調べたところ、明らかになりました。ノードと分類用語の間の接続は別のテーブルに保存され、どのテーブルが大きな問題の1つであるかがわかります。

したがって、私のfield_tagsデータはfield_data_field_tagsテーブルに格納されます。ノードの1つのnidをつかんで、データがどのように見えるかを確認しました。

mysql> select * from field_data_field_tags where entity_id=1082;
+-------------+---------------+---------+-----------+-------------+----------+-------+----------------+
| entity_type | bundle        | deleted | entity_id | revision_id | language | delta | field_tags_tid |
+-------------+---------------+---------+-----------+-------------+----------+-------+----------------+
| node        | photo_gallery |       0 |      1082 |        1082 | und      |     0 |              5 |
+-------------+---------------+---------+-----------+-------------+----------+-------+----------------+
1 row in set (0.00 sec)

上記の情報を理解すると、field_data_field_tagsテーブルに結合し、entity_id=nidで結合する必要があることがわかりました。

5
Kenny Wyland