Hintergrundinformationen hierzu finden Sie unter http://drupal.org/node/1067802 .
In welchen Situationen möchte ich db_select () verwenden oder sollte ich mich nur auf db_query verlassen?
Hintergrundinformationen hierzu finden Sie unter http://drupal.org/node/1067802 .
In welchen Situationen möchte ich db_select () verwenden oder sollte ich mich nur auf db_query verlassen?
Antworten:
Es gibt 5 Gründe, SelectQuery zu verwenden
Sie erstellen dynamische Abfragen mit einer unterschiedlichen Anzahl von Bedingungen, Verknüpfungen, Feldern usw. Ein Beispiel finden Sie unter field_read_fields () .
Sie möchten sogenannte Extender verwenden . Beispiele für Extender sind PagerDefault (ersetzt pager_query () ) und TableSort (ersetzt tablesort_sql () ). Diese ermöglichen es, SelectQuery um zusätzliche Funktionen zu erweitern. Siehe auch Wie erstelle ich mit einem Pager sortierbare Tabellen mit Daten aus einer benutzerdefinierten Tabelle? . Ein Beispiel: node_page_default () .
Sie möchten zulassen, dass andere Module Ihre Abfragen ändern. Dann können Sie sogenannte Tags hinzufügen, und SelectQuery ruft automatisch einen entsprechenden Alter Hook für dieses Tag auf. Ich verlasse mich bei meinem Privatemsg-Modul stark darauf (das haben wir bereits in D6 mit einem benutzerdefinierten Query Builder gemacht).
Wenn Sie das node_access-System verwenden möchten / müssen, um nur Knoten anzuzeigen, die der Benutzer sehen darf. Fügen Sie einfach das Tag 'node_access' zu Ihrer $ query hinzu. Dies ersetzt db_rewrite_sql ().
SelectQuery verfügt über einige Funktionen, mit denen der Code in allen unterstützten Datenbanken gleich funktioniert. Zum Beispiel gibt es SelectQuery :: orderRandom () . Und wenn Sie eine LIKE-Bedingung haben, stellt -> condition ('field', $ value, 'LIKE') sicher, dass bei diesem Vergleich immer die Groß- und Kleinschreibung nicht beachtet wird. In D6 mussten Sie LOWER () für das verwenden, was viel langsamer war. Aber AFAIK, es gibt momentan nicht mehr als diese beiden.
Wenn keiner dieser Gründe für einen bestimmten Fall zutrifft, verwenden Sie db_query ().
Die Dokumentation überdb_query()
sagt:
Verwenden Sie diese Funktion für SELECT-Abfragen, wenn es sich nur um eine einfache Abfragezeichenfolge handelt. Wenn der Aufrufer oder andere Module die Abfrage ändern müssen, verwenden Sie stattdessen db_select ().
Ich verwende immer db_select, da ich Lesbarkeit, Wartbarkeit und datenbankübergreifende Kompatibilität gegenüber kleinen Leistungssteigerungen bevorzuge. Darüber hinaus geben die in der genannten Ausgabe angegebenen Zahlen meines Erachtens ein falsches Bild der Gesamtleistung. Wir sprechen von einem Unterschied von 300 Mikrosekunden bei einer Abfrage, die bei der Rückgabe von mehr als einer einzelnen Spalte häufig im Bereich von mehreren Millisekunden ausgeführt wird. Und ich würde mich nicht wundern, wenn es nur einen einzigen Aufwand (Laden von Klassen) gibt und daher die Unterschiede für eine vollständige (Seiten-) Anfrage weitaus geringer sind.