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
genieße das Leben
quelle

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.

Berdir
quelle
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.
}
Sivaji
quelle
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();
Gurcharan
quelle
-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++;
}**
Kalamityjane
quelle