Bununla ilgili arka plan için lütfen http://drupal.org/node/1067802 adresini ziyaret edin .
Bütün bunlar göz önüne alındığında, db_select () kullanmak isteyebileceğim durumlar nelerdir, yoksa sadece db_query'ye güvenmem gerekir mi?
Bununla ilgili arka plan için lütfen http://drupal.org/node/1067802 adresini ziyaret edin .
Bütün bunlar göz önüne alındığında, db_select () kullanmak isteyebileceğim durumlar nelerdir, yoksa sadece db_query'ye güvenmem gerekir mi?
Yanıtlar:
SelectQuery kullanmak için 5 neden vardır
Değişen sayıda koşul, birleşme, alan vb. İle dinamik sorgular oluşturuyorsunuz. Örnek için field_read_fields () 'ye bakınız .
Extender denilen kullanmak istiyorsunuz . Örnek genişleticiler PagerDefault (yerini almakta pager_query () ) ve TableSort (yerine tablesort_sql () ). Bunlar, SelectQuery'ye ek işlevler eklemenize izin verir. Ayrıca bkz. Özel bir tablodan veri içeren bir çağrı cihazıyla sıralanabilir masalar nasıl oluşturulur? . Bir örnek: node_page_default () .
Diğer modüllerin sorgularınızı değiştirmesine izin vermek istiyorsunuz. Ardından etiketler ekleyebilirsiniz ve SelectQuery otomatik olarak bu etiket için karşılık gelen bir değiştirme kancasını arayacaktır. Privatemsg modülümle buna çok güveniyorum (Zaten bunu D6'da özel bir sorgu oluşturucu ile yaptık).
Node_access sistemini sadece düğümleri göstermek için kullanmak / kullanmak istiyorsanız kullanıcının görmesine izin verilir. Sadece 'node_access' etiketini $ sorgunuza ekleyin. Bu db_rewrite_sql () yerine geçer.
SelectQuery, kodunuzun tüm desteklenen veritabanlarında aynı şekilde çalışmasına yardımcı olan birkaç özelliğe sahiptir. Örneğin, SelectQuery :: orderRandom () var . Ve eğer bir LIKE durumunuz varsa, -> condition ('field', $ value, 'LIKE') her zaman küçük / küçük harf duyarlı bir karşılaştırma olduğundan emin olacaktır. D6'da, çok daha yavaş olan için LOWER () kullanmak zorunda kaldı. Ancak AFAIK, şu anda bu ikisinden daha fazlası yok.
Bu nedenlerden hiçbiri belirli bir durum için geçerli değilse, db_query () kullanın.
Hakkında belgelerdb_query()
diyor ki:
SELECT sorguları için bu işlevi yalnızca basit bir sorgu dizesiyse kullanın. Arayan veya diğer modüllerin sorguyu değiştirmesi gerekiyorsa, bunun yerine db_select () kullanın.
Her zaman db_select'i küçük performans kazanımlarına göre okunabilirliği, bakımı ve çapraz veritabanı uyumluluğunu tercih ettiğim için kullanıyorum. Ayrıca, belirtilen sayılarda verilen rakamların genel performans hakkında yanlış bir fikir verdiğini düşünüyorum. Bir sorguda 300 mikrosaniyelik bir farktan bahsediyoruz, tek bir sütundan daha fazlasını döndürürken genellikle milisaniyelik aralıkta çalışan. Ve sadece bir kerelik ek yükü (sınıf yükleme) bazı zamanlar olsa ve bu nedenle tam (sayfa) bir istek için farklılıklar çok daha az olsaydı şaşırmam.