左結合クエリを作成するにはどうすればよいですか?


7

ノードIDを知っている "vid"の値を取得し、 "vid"が2に等しい行の "name"の値を取得します。

単純なクエリだとしたら、どう書くかわかりません。左結合クエリの書き方がわかりません。

Drupalの「プレーン」SQLクエリは次のとおりです。

$result = db_query('SELECT tid FROM {taxonomy_index} WHERE nid = :nid', array(':nid'=>$nid));

同等の生SQLクエリは次のとおりです。

SELECT did, name FROM taxonomy_index as ti LEFT JOIN taxonomy_term_data AS ttd ON ti.tid = ttd.tid WHERE vid = 2 and nid = $nid

回答:


11

このような静的クエリではdb_select()を使用する必要はありません。実際には、参照すべきではありません。db_selectがdb_queryよりもはるかに遅いとすれば、なぜそれを使用したいのでしょうか。

それをdb_query()に渡すだけで、変更されたのは、プレースホルダーを追加する方法だけです。

$result = db_query('select tid,name from {taxonomy_index} as ti left join {taxonomy_term_data} as ttd on ti.tid=ttd.tid where vid=2 and nid=:nid', array(':nid' => $nid));
foreach ($result as $term) {
  // $term contains the object for the taxonomy term.
}

詳細についてはhttp://drupal.org/developing/api/databaseを、一般的なDrupal 6から7のデータベース構文変換情報については私のブログ投稿を参照してください。


どうもありがとう。リンクはとても良いです。読みましたが、動的クエリとはまだわかりませんか?
enjoylife

1
動的クエリはSivajiが書いたものです。db_select()を使用してPHPコードでクエリを作成します。たとえば、何かに基づいてさまざまな条件(構成、アクセス許可、さまざまなページなど)を持つクエリがある場合に便利です
Berdir

上記のコードで、vid = 2をvid =:vidに変更してから、array( ':vid' => 2))を実行する必要がありますか?ありがとう
エンジョイライフ'29年

1
必須ではありませんが、そうです。特に、そのvidをハードコーディングしたくないが、たとえば、variable_get()を使用してオーバーライドできるようにする場合。そうするでしょうarray(':vid' => variable_get('yourmodule_vocabulary', 2))。次に、デフォルトで2になりますが、settings.phpでオーバーライドするか、管理設定フォームを作成できます。
Berdir

はい。vid=2 to vid=:vid then array(':vid' => 2)データベースサーバー間でコードの互換性を維持するには、これを行う必要があります。Drupalコアも同じパターンに従います。
シバジ、

25
$terms = db_select('taxonomy_index', 'ti')
  ->fields('ti', array('tid', 'name'));
$terms->leftJoin('taxonomy_term_data', 'ttd', 'ti.tid = ttd.tid');
$terms->condition('vid', 2)
  ->condition('nid', $nid)
  ->execute();

while ($term = $terms->fetch()) {
  // $term contains the object for the taxonomy term.
}

結果を取得する方法?ありがとう
エンジョイライフ

これは機能しますか?これと同じことを実行しようとすると、condition()がメンバー関数ではないというエラーが発生します。
Johnathan Elmore

4
これは機能しません。Drupal結合は連鎖できません。あなたが行くと思いますので、:$terms = db_select(...)->fields(...); $terms->leftJoin(...); $terms->condition(...)->...
Neograph734

1
@ Neograph734私はあなたのコメントに基づいて編集を提案しました。
2013年

0
        $catalog_pagination = db_select('taxonomy_index', 'ti')
          ->fields('pimg',array('uc_product_image_target_id','entity_id'))
          ->fields('fm',array('fid','filename'))    
          ->fields('ti', array('nid', 'tid'));
        $catalog_pagination->leftJoin('node__uc_product_image', 'pimg', 'pimg.entity_id = ti.nid'); 
        $catalog_pagination->leftJoin('file_managed', 'fm', 'fm.fid = pimg.uc_product_image_target_id');  
        $catalog_pagination->condition('ti.tid', $term_id);
        $catalog_pagination->orderBy('ti.nid', 'DESC');
        $catalog_pagination = $catalog_pagination->execute();
        $total_pages = $catalog_pagination->fetchAll();

-1

//「fetchAll()」関数を忘れないでください:

$terms = db_select('taxonomy_index', 'ti')
  ->fields('ti', array('tid', 'name'));
$terms->leftJoin('taxonomy_term_data', 'ttd', 'ti.tid = ttd.tid');
$terms->condition('vid', 2)
  ->condition('nid', $nid)
  ->execute()
  **->fetchAll();** // an array of objects

**$i = 0;
while ($i < count($terms)) {
  $terms[i]->...
  // $terms[i] contains the object for the taxonomy term.
  $i++;
}**
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.