Wie schreibe ich eine Left Join-Abfrage?


7

Ich möchte den Wert von "vid" erhalten, indem ich die Knoten-ID kenne, und den Wert von "name" für die Zeilen erhalten, in denen "vid" gleich 2 ist.

Wenn es eine einfache Abfrage wäre, würde ich nicht wissen, wie ich sie schreiben soll; Ich weiß nicht, wie ich eine Left Join-Abfrage schreiben soll.

Die "einfache" SQL-Abfrage in Drupal lautet wie folgt:

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

Die entsprechende SQL-Rohabfrage lautet wie folgt:

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

Antworten:


11

Sie müssen db_select () für eine solche statische Abfrage nicht verwenden. Sie sollten eigentlich nicht sehen , da db_select viel langsamer als db_query ist, warum sollte ich es verwenden wollen? .

Sie müssen das nur an db_query () übergeben. Das einzige, was sich geändert hat, ist das Hinzufügen von Platzhaltern.

$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.
}

Weitere Informationen finden Sie unter http://drupal.org/developing/api/database. In meinem Blogbeitrag finden Sie allgemeine Informationen zur Konvertierung der Drupal 6 bis 7-Datenbanksyntax.


Danke vielmals. Der Link ist sehr gut. Ich habe es gelesen. Aber ich weiß immer noch nicht, was eine dynamische Abfrage ist.
genießen Sie das Leben

1
Eine dynamische Abfrage hat Sivaji geschrieben: Verwenden von db_select (), um eine Abfrage mit PHP-Code zu erstellen. nützlich zum Beispiel, wenn Sie eine Abfrage mit unterschiedlichen Bedingungen haben, die auf etwas basieren (Konfiguration, Berechtigung, verschiedene Seiten ..)
Berdir

Könnte ich im obigen Code vid = 2 in vid =: vid und dann array (': vid' => 2) ändern? Sollte ich dies tun müssen? danke
genießen

1
Es ist nicht unbedingt notwendig, aber ja, es könnte Sinn machen. Vor allem, wenn Sie dieses Video nicht fest codieren möchten, sondern beispielsweise variable_get () verwenden möchten, um es überschreibbar zu machen. also würdest du tun array(':vid' => variable_get('yourmodule_vocabulary', 2)). Dann wäre es standardmäßig 2, aber Sie könnten es in settings.php überschreiben oder ein Formular für die Administratoreinstellungen dafür erstellen.
Berdir

Ja. Sie müssen dies tun, vid=2 to vid=:vid then array(':vid' => 2)um Ihren Code auf allen Datenbankservern kompatibel zu halten. Der Drupal-Kern folgt demselben Muster.
Sivaji

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

Wie kann ich das Ergebnis abrufen? danke
genießen

Funktioniert das? Wenn ich versuche, etwas Identisches zu tun, erhalte ich die Fehlermeldung, dass condition () keine Mitgliedsfunktion ist.
Johnathan Elmore

4
Das wird nicht funktionieren. Drupal-Verknüpfungen können nicht verkettet werden. Also würden Sie gehen:$terms = db_select(...)->fields(...); $terms->leftJoin(...); $terms->condition(...)->...
Neograph734

1
@ Neograph734 Ich habe eine Bearbeitung vorgeschlagen, die auf Ihrem Kommentar basiert.
FLIEGEN

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

// Vergiss nicht die Funktion "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++;
}**
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.