Докладнішу інформацію про це див . На веб-сторінці http://drupal.org/node/1067802 .
З огляду на все це, які ситуації існують, коли я, можливо, захочу використовувати db_select (), або я повинен покладатися виключно на db_query?
Докладнішу інформацію про це див . На веб-сторінці http://drupal.org/node/1067802 .
З огляду на все це, які ситуації існують, коли я, можливо, захочу використовувати db_select (), або я повинен покладатися виключно на db_query?
Відповіді:
Існує 5 причин використовувати SelectQuery
Ви будуєте динамічні запити з різною кількістю умов, приєднань, полів тощо. Для прикладу див. Field_read_fields () .
Ви хочете використовувати так звані розширювачі . Прикладами розширень є PagerDefault (замінює pager_query () ) і TableSort (замінює tableort_sql () ). Вони дозволяють додатково додати функціональність до SelectQuery. Див. Також Як створювати сортувальні таблиці з пейджером із даними із користувацької таблиці? . Приклад: node_page_default () .
Ви хочете дозволити іншим модулям змінювати ваші запити. Потім ви можете додати так звані теги, і SelectQuery автоматично зателефонує до відповідного гачка для цього тегу. Я сильно покладаюся на це з моїм модулем Privatemsg (ми вже це робили в D6 зі спеціальним конструктором запитів).
Якщо ви хочете / потрібно використовувати систему node_access, щоб показувати лише вузли, яким користувач може бачити. Просто додайте тег "node_access" до вашого $-запиту. Це замінює db_rewrite_sql ().
SelectQuery має кілька функцій, завдяки яким ваш код працює однаково у всіх підтримуваних базах даних. Наприклад, є SelectQuery :: orderRandom () . І якщо у вас є умова LIKE, -> condition ('поле', $ value, 'LIKE') переконається, що це порівняння завжди нечутливе до випадків. У D6 вам довелося використовувати LOWER () для того, що було набагато повільніше. Але AFAIK, наразі не більше двох цих.
Якщо жодна з цих причин не стосується конкретного випадку, використовуйте db_query ().
Документація проdb_query()
каже:
Використовуйте цю функцію для SELECT запитів, якщо це просто простий рядок запиту. Якщо абоненту або іншим модулям потрібно змінити запит, скористайтеся db_select ().
Я завжди використовую db_select, оскільки віддаю перевагу читабельності, ремонтопридатності та сумісності міжбазових баз даних за невеликих прибутків. Більше того, я думаю, що цифри, наведені у згаданому номері, дають неправильне уявлення про загальну ефективність. Ми говоримо про різницю в 300 мікросекунд у запиті, який при поверненні більш ніж одного стовпця часто працює в діапазоні кількох мілісекунд. І я не був би здивований, якщо є якийсь разовий накладні витрати (завантаження класу), і, таким чином, різниці для повного запиту (сторінки) набагато менші.