Drupal → Работа с базой данных в Drupal 7
Выборка с условием:
// Drupal 6 $nodes = db_query(" SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d ", 'page', 1); // Drupal 7, static query $nodes = db_query(" SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid ", array(':type' => 'page', ':uid' => 1))->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->condition('n.type', 'page') ->condition('n.uid', 1) ->execute() ->fetchAll();
Выборка из двух таблиц соединённых с помощью INNER JOIN:
// Drupal 6 $nodes = db_query(" SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid "); // Drupal 7, static query $nodes = db_query(" SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid ")->fetchAll(); // Drupal 7, dynamic query $query = db_select('node', 'n'); $query->innerJoin('users', 'u', 'n.uid = u.uid'); $query->fields('n', array('title')); $query->fields('u', array('name')); $nodes = $query->execute()->fetchAll();
Следует помнить, что некоторые методы (например джоины) не возвращают объект SelectQuery, и поэтому их нельзя использовать в цепочке вызовов вроде db_select()->method1()->innerJoin()->method2()
.
Получить значение поля у единственной записи:
// Drupal 6 $title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123)); // Drupal 7, static query $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchField(); // Drupal 7, dynamic query $title = db_select('node', 'n') ->fields('n', array('title')) ->condition('n.nid', 123) ->execute() ->fetchField();
Получить объект по его id:
// Drupal 6 $node = db_fetch_object(db_query("SELECT * FROM {node} WHERE nid = %d", 123)); // Drupal 7, static query $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchObject(); // Drupal 7, dynamic query $node = db_select('node', 'n') ->fields('n') ->condition('n.nid', 123) ->execute() ->fetchObject();
Посчитать число записей:
// Drupal 6 $count = db_result(db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")); // Drupal 7, static query $count = db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")->fetchField(); // Drupal 7, dynamic query, вариант 1 $count = db_select('node', 'n') ->condition('n.uid', 1) ->countQuery() ->execute() ->fetchField(); // Drupal 7, dynamic query, вариант 2 $query = db_select('node'); $query->addExpression('COUNT(*)'); $count = $query->execute()->fetchField();
Найти минимальное значение:
// Drupal 6 $min = db_result(db_query("SELECT MIN(fieldname) FROM {table}")); // Drupal 7, static query $min = db_query("SELECT MIN(fieldname) FROM {table}")->fetchField(); // Drupal 7, dynamic query $query = db_select('table'); $query->addExpression('MIN(fieldname)'); $min = $query->execute()->fetchField();
Выбрать определённое количество записей:
// Drupal 6 $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10"); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10")->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->range(0, 10) ->execute() ->fetchAll();
Обойти записи:
// Drupal 6 $nodes = db_query("SELECT * FROM {node}"); while ($node = db_fetch_object($nodes)) { $items[] = $node->title; } // Drupal 7, static query $result = db_query("SELECT * FROM {node}"); foreach ($result as $node) { $items[] = $node->title; } // Drupal 7, dynamic query $result = db_select('node', 'n')->fields('n')->execute(); foreach ($result as $node) { $items[] = $node->title; }
Обновление записи:
// Drupal 6 db_query("UPDATE {node} SET status = %d WHERE nid = %d", 1, 123); // Drupal 7, static query db_query("UPDATE {node} SET status = :status WHERE nid = :nid", array(':status' => 1, ':nid' => 123)); // Drupal 7, dynamic query db_update('node') ->fields(array('status' => 1)) ->condition('nid', 123) ->execute();
Инкремент значения поля:
// Drupal 6 db_query("UPDATE {node_counter} SET totalcount = totalcount + 1 WHERE nid = %d", 123); // Drupal 7, static query db_query("UPDATE {node_counter} SET totalcount = totalcount + 1 WHERE nid = :nid", array(':nid' => 123)); // Drupal 7, dynamic query db_update('node_counter') ->expression('totalcount', 'totalcount + 1') ->condition('nid', 123) ->execute();
Удаление записи:
// Drupal 6 db_query("DELETE FROM {node} WHERE uid = %d AND created < %d", 1, time() - 3600); // Drupal 7, static query db_query("DELETE FROM {node} WHERE uid = :uid AND created < :created", array(':uid' => 1, ':created' => time() - 3600)); // Drupal 7, dynamic query db_delete('node') ->condition('uid', 1) ->condition('created', time() - 3600, '<') ->execute();
Очистка таблицы (удаление всех данных из таблицы):
// Drupal 6, Drupal 7 static query db_query("TRUNCATE {node}"); // Drupal 7, dynamic query db_truncate('node')->execute();
Добавление записи:
// Drupal 6 db_query("INSERT INTO {mytable} (intvar, stringvar, floatvar) VALUES (%d, '%s', %f)", 5, 'hello world', 3.14); $id = db_last_insert_id(); // Drupal 7, dynamic query $id = db_insert('mytable') ->fields(array( 'intvar' => 5, 'stringvar' => 'hello world', 'floatvar' => 3.14, )) ->execute();
Для добавления данных можно по прежнему пользоваться drupal_write_record()
Использование логического оператора OR в условии:
// Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE uid = %d OR status = %d", 1, 0); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} WHERE uid = :uid OR status = :status", array(':uid' => 1, ':status' => 0))->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->condition( db_or() ->condition('uid', 1) ->condition('status', 0) ) ->execute() ->fetchAll();
Использование оператора IN в условии:
$nids = array(1, 2, 3); // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid IN (" . db_placeholders($nids) . ")", $nids); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => $nids))->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', $nids, 'IN') ->execute() ->fetchAll();
Использование оператора LIKE в условии:
// Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE title LIKE '%%%s%%'", 'substring'); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} WHERE title LIKE :title", array(':title' => '%' . db_like('substring') . '%'))->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->condition('n.title', '%' . db_like('substring') . '%', 'LIKE') ->execute() ->fetchAll();
Использование оператора BETWEEN в условии:
// Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN %d AND %d", 123, 456); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN :nid1 AND :nid2", array(':nid1' => 123, ':nid2' => 456))->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', array(123, 456), 'BETWEEN') ->execute() ->fetchAll();
Проверка значения на NULL:
// Drupal 6, Drupal 7 static query $result = db_query("SELECT * FROM {table} WHERE field IS NULL"); // Drupal 7, dynamic query, вариант 1 $result = db_select('table', 't') ->fields('t') ->condition('t.field', NULL, 'IS NULL') ->execute(); // Drupal 7, dynamic query, вариант 2 $result = db_select('table', 't') ->fields('t') ->isNull('t.field') ->execute();
Сложные условия в WHERE:
// Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d", 2011); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created", array(':created' => 2011))->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->where('YEAR(FROM_UNIXTIME(n.created)) = :created', array(':created' => 2011)) ->execute() ->fetchAll();
Сортировка:
// Drupal 6 $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC"); // Drupal 7, static query $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC")->fetchAll(); // Drupal 7, dynamic query $nodes = db_select('node', 'n') ->fields('n') ->orderBy('n.created', 'DESC') ->orderBy('n.title', 'ASC') ->execute() ->fetchAll();
Получить результаты запроса в виде двумерного ассоциативного массива:
// Drupal 6 $result = db_query("SELECT nid, title, created FROM {node}"); $nodes = array(); while ($row = db_fetch_object($result)) { $nodes[$row->nid] = $row; } // Drupal 7, static query $nids = db_query("SELECT nid, title, created FROM {node}")->fetchAllAssoc('nid'); // Drupal 7, dynamic query $nids = db_select('node', 'n') ->fields('n', array('nid', 'title', 'created')) ->execute() ->fetchAllAssoc('nid');
Получить одну колонку из таблицы в виде простого одномерного массива:
// Drupal 6 $result = db_query("SELECT nid FROM {node}"); $nids = array(); while ($row = db_fetch_object($result)) { $nids[] = $row->nid; } // Drupal 7, static query $nids = db_query("SELECT nid FROM {node}")->fetchCol(); // Drupal 7, dynamic query $nids = db_select('node', 'n') ->fields('n', array('nid')) ->execute() ->fetchCol();
Получить одномерный ассоциативный массив, где ключами будет первая колонка запроса, а значениями — вторая:
// Drupal 6 $result = db_query("SELECT nid, title FROM {node}"); $titles = array(); while ($row = db_fetch_object($result)) { $nids[$row->nid] = $row->title; } // Drupal 7, static query $titles = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed(); // Drupal 7, dynamic query $titles = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->execute() ->fetchAllKeyed();
Полный мануал с кучей примеров есть на официальном сайте — Database API.
Добавлено 09/07/2011
Видео с DrupalCamp Kyiv 2011:
Комментарии
php5
красава... :)
наконец то. главное с db_delete() не наделать хренотени
Вот это да! Как все намного проще будет делать! ООП рулит!
Вах , блин я седня полвечера убил и ничего по теме не нашел. А твой сайт просто супер ! Drupal 7 вроде недавно появилась, а у тебя уже актуальная информация. Спасибо !
Отличный справочный материал!
Спасибо за статью.
А как реализовать такую конструкцию? $query->condition('YEAR(FROM_UNIXTIME(c.dateborn))', $edit->dateborn_year, '='); Запрос с таким условием не работает, т.к скобки удаляются.
а как узнать, что, например, при получении строки через
Обойти записи:
// Drupal 7
$nodes = db_select('node', 'n')->fields('n')->execute(); // или $nodes = db_query("SELECT * FROM {node}");
foreach ($nodes as $node) {
$items[] = $node->title;
}
запрос вернет false? вроде в любом случае там объект возвращается. даже если строки такой нету.
нет
*как узнать, что... запрос вернет false?
запрос не возвращает false
это плохо. как узнать что такой запрос не выдаст ничего? неохота делать ещё 1 запрос на кол-во записей. можно конечно сделать проверку на значения переменных после цикла -- но это как-то коряво.
if ($result->rowCount()) ...
Люди подскажите пожалуйста, вот код:
Выполнение данного запроса должно вывести двумерный массив, типа:
Так вот вопрос: подскажите, как мне правильно обойти строки?
Если запрос закончить так:
выводит только одну строку...
если написать типа:
Пишет ошибку:
Объясните, что я делаю не так? Только не пинайте сильно, недавно начал разбираться в друпале...
P.S. БД у меня PostgreSQL
Всё, разобрался. Блин с субботы мучился и никак, а тут раз, и получилось.
Вот как закончил запрос, и вывело так как мне нужно:
З.Ы. Может кому полезно будет, сэкономлю пару минут)
Еще важно для выборок материалов не забывать добавлять тег:
Здравствуйте, сделал запрос, а вывести не могу, как это делается?
$nodes = db_select('users', 'n')
->fields('n')
->execute();
для начала хоть целеком таблицу вывести, а потом буду копаться как сделать поиск с формы (несколько полей на форме) по таблице.
смотрите пример Обойти записи
подскажите, пожалуйста, как быть с подзапросом:
И насколько это правильно. Спасибо
http://xandeadx.ru/blog/drupal/413
не правильно
А что в таком случае будет правильным решением? Спасибо.
Правильно ли так получиться
хотел получить:
сделать два запроса
Как извлечь дату в формате
FROM_UNIXTIME(DateTimeStart, '%Y-%m-%d') AS date
поле DateTimeStart формата int.Изменить тип поля в БД нельзя.
Извлечь обычный интегер и потом на стороне пхп преобразовать функцией date тоже нельзя,так по этому полю будет GROUP BY
Блин..тоже самое же делал, и не получалось почему то...
Спасибо;)
Спасибо xandeadx
Отлично вывел "все" примеры работы с базой.
У меня вопрос касательно
->fetchObject()
Как мне во втором примере получить объект ноды?
Спасибо!
Разобрался сам! Привожу код, может кому поможет.
Подскажите, пожалуйста, как быть с условием IF NOT EXISTS. Спасибо.
И еще с запросом типа:
Спасибо за видео с DrupalCamp Kyiv 2011
Спасибо, за полезный материал. Скажите, вот составить простой запрос - задача решаемая. Но вот вытащить что-то сложное из базы с кучей джоинов...... Вот если в своем модуле, нужно выполнить какую-то сложную выборку, ведь можно ее сперва сделать через VIEWS , затем скопировать получившийся запрос и вставить в db_query() ?
Такое ведь возможно? Если да, то как правильно это делать? я никак не могу разобраться, уже все мозги выкипели.. Проблема в том, что НЕ достаются значения cck полей . Т.е. достается только id ноды и title ноды . Все дополнительные поля, не достаются.. Подскажите пожалуйста, почему? что я делаю не так... почему предпросмотр VIEWS при таком запросе выдает все результаты, а db_query нет?
Во вьюшке достаю 3 поля: title, body, field_delivery_cost . А когда делаю DSM полученного результата, вижу 4 строки:
node_title (String, 14 characters ) Заголовок тестовой ноды
nid (String, 2 characters ) 68
field_data_body_node_entity_type (String, 4 characters ) node
field_data_field_delivery_cost_node_entity_type (String, 4 characters ) node
Т.е. имеем только значение тайтла... + появилось значение айдишника ноды.. А значение поля BODY и кастомного поля - представлены в виде строки node ..
Выручайте....
для начала неплоха бы запрос предоставить, телепатическими способностями не обладаю
Извините, просто я подумал ведь это для любого вьюсовского запроса, который вытаскивает кастомные поля такая ситуация.. Наверное вьювс потом еще пропускает запрос через какой-то обработчик...
в запросе выбираются заголовки, nid-ы и две строки 'node'. результат ожидаемый
Да уж, наверное так и есть... Тогда вопрос по другому. Можно ли поступить как я говорил, т.е. сгенерировать запрос во вьюхе, скопировать его и использовать? Из моей ситуации, я понимаю, что походу нет.. (в ситуации я запрос упростил значительно, чтобы была понятна суть..)
можно
да, но вот я сгенерил запрос вьюшкой, который типо вытаскивает то, что мне нужно... А на деле, он тащит только нид и тайтл...
В чем может быть проблемма : Когда применяю
выдаёт ошибку
Fatal error: Call to a member function field() on a non-object in
и указывает на строку$query->fields('n', array('title'));
у меня работает без ошибок
Эти запросы прямо в page.tpl.php можно писать да?
можно, но не нужно
Подскажите почему конструкция:
$query->condition('p.forum_id', 1);
$query->condition('p.forum_id', 10);
превращается в:
WHERE (p.forum_id = :db_condition_placeholder_0) AND (p.forum_id = :db_condition_placeholder_1)
Почему так получается и как получить конкретные значения вместо :db_condition_placeholder_0?
И еще: как получить OR вместо AND для нескольких кондишинов?
Приходится делать так: $query->where('p.forum_id = 1 OR p.forum_id = 10');
А кондишинами так можно сделать?
вызвать метод execute()
http://xandeadx.ru/blog/drupal/88#section-or
Как-то подготовленный запрос сбил с толку. При выполнении действительно все ок.
Спасибо!
а можно еще и пример с UNION в случае когда в таблицах разное количество полей
делаю так, не получается
При этом в table1 к примеру 5 полей, а в table2 только 2.
Подскажите пожалуйста, а как правильно сформировать запрос с лайком, например такой:
condition('title', '%' . db_like('ONE') . '%', 'LIKE')
А зачем нужна функция db_like ? читал апи, но как-то недопонимаю..
почему нельзя написать так:
Попробовал, вроде и так работает...
+ подскажите плиз, получается, что в condition по умолчанию используется оператор AND? т.е. если у нас двойное условие через AND, мы просто пишем
->condition1
->condition2
А если условие OR , тогда пользуемся db_or() ?
А зачем тогда нужно db_and() ?
P.S. Спасибо за ценный материал и за сайт!
http://api.drupal.org/api/drupal/includes--database--database.inc/functi...
да
да
чтобы использовать внутри db_or()
Возможно вопрос немного не в тему.. но оч надо.. Насколько я знаю, в семерке база данных в INNDB , когда я портировал модуль из шестерки в семерку, импорт товаров вместо 5 сек длится 3 минуты. Почитал это http://www.sql.ru/forum/actualthread.aspx?tid=381637 и понял, что в базах INNDB, перед тем, как в цикле выполнять много запросов в базу их нужно сперва обьединить в транзакцию, а потом выполнить ее.. Иначе все жутко медленно..
Не подскажете, как сделать это? вот у ситуация например: нужно записать 1000 строк в базу. Я делаю так: форичем пробегаю по массиву строк, который нужно записать, и на каждом шаге делаю запрос инсерт в базу..
При таком подходе, это очень долго в семерке... Выручайте, помогите с транзакциями, возможно это будет интересно и другим читателям..
Пожалуйста, подскажите!
UPDATE t1, t2 SET t1.user = '145' WHERE ((t1.items=t2.id) and (t2.id=5))
корректен ли такой запрос?
И как он выглядит в drupal ?
в 7 drupal
А как узнать ID последней строки записанной в базу с помощью этих методов?
Например я использую запрос:
Классическое ПХП предлагает мне использовать mysql_insert_id(), но этой функции как я понял нужен идентификатор соединения с базой, а где его взять?
Либо может есть друпал-вей метод? я нашел только это, но не смог приспособить его к моему запросу: http://drupal.org/node/141926#comment-4536930
db_insert::execute() возвращает id последней вставленной записи http://drupal.org/node/310079
Ого, как все оказалось просто! Спасибо :)
Как засунуть
RAND()
в
->orderBy()
http://drupal.org/node/310075#random_ordering
Получилось. спасибо)
а как в запросе
$count = db_select('node')
->countQuery()
->execute()
->fetchField();
указать еще условие например $node->nid = 1
так же как в любом другом запросе - condition($field, $value, $operator)
Спасибо, с LIKE я бы еще долго дрочился...
а как составить что нить вроде этого:
select FROM_UNIXTIME(timestamp, '%Y%m%d') as ts, count(*) from `simpleads_clicks`
where (FROM_UNIXTIME(timestamp) <= NOW() AND FROM_UNIXTIME(timestamp) >= SUBDATE(NOW(), INTERVAL 1 MONTH) and nid = 45)
group by ts
http://api.drupal.org/api/drupal/includes!database!select.inc/function/SelectQueryInterface%3A%3AaddExpression/7
http://api.drupal.org/api/drupal/includes!database!query.inc/function/QueryConditionInterface%3A%3Awhere/7
угу спс... уэе разобрался, просто запостил сразу чтобы быстрее помогли, время мало))
вот что получилосб
Помогите пожалуйста. Делаю запрос как по документации, но результат шокирующий. Вот запрос:
$pid = "3,5";
$product_nids = db_query('SELECT entity_id
FROM {field_data_field_product} WHERE field_product_product_id IN (:pid)', array(':pid' => $pid));
foreach ($product_nids as $nid) {
var_dump($nid);
}
Но дело в том, что по циклу проходится только один раз, хотя обе записи присутствуют в БД. Что не так?
http://xandeadx.ru/blog/drupal/88#section-in
Но я же делаю как в первом варианте. ПОчему он работает не правильно? Вариант 2 у меня выдает ошибку и скрипт прерывается на строке где execute()
в плейсхолдер надо передавать массив, а не строку
Доброе утро. Направьте вектор мыслей.
Создал таблицу по вот этому примеру.
Вывод таблицы сделал через Views.
1.Не хватает знаний сделать кнопки сортировок для каждого поля
2. Где можно почитать про создание сложных связанных бд с сущностями связками относительно Drupal?
mysql_num_rows($request); - есть аналог?
http://xandeadx.ru/blog/drupal/88#comment-2204
не могу аонять как правильно использовать drupal_write_record. Как я понял она должна если записи имееться в бд обновлять если нету добавлять новую
таблица имеет следующую структуру
использую следующий код
это код обновляет запись type если таковая имееться в таблице, если нету новую не добавляет.
следующий код
добавляет запись в независимости имеется такая или нет.
как сделать чтобы если имеется запись поля type она обновлялась, если нету добавлялась новая?
не правильно поняли
http://api.drupal.org/api/drupal/includes!database!database.inc/function/db_merge/7
drupal 6.
допустим использую запрос
а как мне узнать результат выполнения, т е обновил чтото запрос или нет, и еще например если запрос обновит неск записей (не этот а вообще любой другой) то как узнать какие записи он обновил, ну например мне надо обновить там юзера у всех нгод со статусом 1 и могу ли я потом узнать ид обновленных нод.
подскажите как добавить оператор REGEXP в db_select()?
http://xandeadx.ru/blog/drupal/88#comment-4436
Чем заменить pager_query c Drupal 6 в Drupal 7 если запрос что бы не переписывать запрос в новую форму?
extend('PagerDefault') не работает с db_query.
пользуйтесь db_select
Привет, а можно подробней объяснить про инкремент значений полей, у меня всплыла задача: нужно переопределить значение авто-инкримента для полей nid и vid например на 1000, потом все материалы пересейвить под новые ниды и виды (1000, 1001 ...), + конечно же не потерять все ривизии для нод, уже более полу дня не могу костыль сей реализовать..
Привет!
Есть такой запрос
который возвращает первые буквы поля NAME убирая дубли.
Написал запрос для 7-ой версии
В итоге получаю результат с дублями, такое ощущение что
->distinct()
не сработал.Хотя если напишу запрос по старинке
все работает замечательно, т.е. выводит первые буквы поля без дублей.
Может кто подсказать что с моим запросом под 7-ку нет?
Сам разобрался. Убрал
->fields('pstr')
и все заработало.Использую hook_query_alter чтобы немного подправить существующий системный запрос.
Столкнулся с необходимостью очистить уже существующее условие WHERE чтобы запилить на его место своё условие выборки. Делаю
не работает. Как правильно?
Нашел пример для groupBy http://www.brenthartmann.com/blog/how-use-hookqueryalter-drupal-7
Но как сделать аналогично для where не понимаю
$where = &$query->where();
Если делаю
Получаю ошибку:
EntityFieldQuery http://drupal.org/node/1343708
тоже хорошая вещь для работы с базой данных
помогите , плиз. надо организовать элементарный запрос :
SELECT count(*) FROM affiliate_users_ids WHERE UCASE(text_id)=UCASE($Var)
вместо $Var надо подставить кое - что (в запросе ниже это txt). бьюсь весь день как организовать это на языке друпал . пытаюсь так :
но выдаёт ошибку :
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'text_id' in 'where clause': SELECT COUNT(*) AS expression FROM (SELECT 1 AS expression FROM {affiliate_users_ids} affiliate_users_ids) subquery WHERE (UCASE(text_id)=UCASE(:txt)) ; Array ( [:txt] => OL1012613 ) в функции gaa_createUserTextID() (строка 14 в файле /usr/www/users/webmisq/drupal/sites/all/modules/gaa_user_sinhronaze/gaa_user_sinhronaze.module).
xandeadx об этом уже давно (Опубликовано в пт, 01/04/2011 - 15:48) написал: Как получить список нод определённого типа со всеми полями
Прошу помощи необходимо выполнить запрос: выбрать записи, где значение поля 1 не равно значению поля 2 из одной таблицы, причем выполнение реализовано в общей массе , те пытался:
$query->condition( 'n.field1', 'n.field2', '!=');
но, естественно не работает ((
http://xandeadx.ru/blog/drupal/88#section-where
Добрый вечер!
У меня есть тип материала "категории" который представляет из себя обычный chekbox, как мне поучить все значения этого типа? Я хочу заполнить форму checkboxes. Чтобы мне не писать значения вручную я хочу сделать запрос.
Подскажите пожалуйста как вывести текущую дату плюс 2 дня: в блоке. Если вывожу date("d")+2 то получаю например 32 марта. Извините за нубовский вопрос php только начал изучать но я так понимаю это надо через запрос к бд делать?
http://php.net/manual/ru/datetime.modify.php
Приветствую!
Можете подсказать как использовать функцию concat в select для объединения двух полей из разных таблиц?
Привожу пример для наглядности.
addExpression(...)
to xandeadx: Спасибо за ответ.
Возник еще один вопрос. В JOIN мне надо сделать проверку с использованием строковой функции LEFT, например:
Принимает ли функция join строковую функцию SQL в условиях проверки?
Я написал так, но что-то join не отрабатывает условие как надо:
Снимаю свой вопрос. Все работает.
Возникла необходимость фильтровать по полю varchar.
Но есть проблема: при генерации запроса друпал обрамляет значения в апострофы и это неправильно сказывается на результате.
Что делаю:
Получаю:
Как заставить друпал генерировать запрос без кавычек в значениях. Иначе результат получается неверным.
кавычки не влияют на результат
Попробуйте. Еще как влияют
С кавычками он ищет последовательность:
1,11,12,2
Без кавычек:
1,2,11,12
Решение найдено:
Помоги пожалуйста реализовать условие для выполнения condition:
1. если в leftJoin были подключены null значения, то должна срабатывать только condition №1
2. если в leftJoin были подключены не null значения, то должна срабатывать только condition №2.
Проблема в том, что сейчас condition срабатывают вместе.
рабрался:
Можете помощь мне разобраться с заданием которые дали мне на новым работе. Мне дали таблицу в Word формате и сказали перевести это на Веб страницу которые преподаватели могли заполнят формы и так в таблице(как Word таблицы) вывести результат. Я создал страницы которые можно заполнять информация ми (с помощи Webform). Но я не могу вывести результат как мне хотелось. Тогда я спросил как можно повлиять на выведенное данных. Они сказали с помощи База данных, но я не могу как это понят потому что у меня нет понятие как и где писать SQL Query? , но у меня есть роль админа. Можете помочь мне, просто хочу сдать задание вовремя и делать хорошо как они дали. Только не пинайте сильно, недавно начал разбираться в друпале . Спасибо я буду ждать и искать пока не сделаю это.
читайте про модуль views
Спасибо, сайт создан на Drupal 6, есть отличи в views
Скажите пожалуйста, а существует ли на данном этапе способ принудительно задавать порядок выводимых полей в запросе ?
А то, как я заметил, сначала будут выводиться именно поля (созданные с помощью addField), а потом - выражения (addExpression), даже если при построении query вызывать эти функции вразнобой.
Просто если не задавать порядок полей принудительно, то могут быть проблемы при построении UNION - запросов.
Всем привет!
Использую вот такой снипет для вывода определенного типа материала
сайт двуязычный а он выводит все подряд тоесть по очередности создания материала подскажите пожалуйста как сделать чтобы вывод зависил от языка
Добрый день!
есть таблица "план", есть таблица "пользователи"
подскажите, пожалуйста, как запомнить значение (имя пользователя), выбранное в select и вставить не само значение, а его id из таблицы "пользователи" в таблицу "план".
то, что ниже, явно не верно, но, быть может, я близок?
<?php
function my_database_insert_form_submit($form, &$form_state) {
$bid = variable_set('u_name',$form_state['values']['u_name']);
$q11 = db_select('user', 'u');
$q11->fields('u',array('id_user'));
$q11->condition('u.u_name', $bid);
/** $q11->where('u.u_name= :created', array(':created' => $bid));*/
$res11=$q11->execute();
$query = db_insert('plan');
$query->fields(array(
'id_user' => $bid,
'id_subject' => $form_state['values']['id_subject'],
'term' => $form_state['values']['term'],
'gl_name' => $form_state['values']['gl_name'],
'lecture' => $form_state['values']['lecture'],
'practice' => $form_state['values']['practice'],
'lab_plan' => $form_state['values']['lab_plan'],
'lab_all' => $form_state['values']['lab_all'],
'consult' => $form_state['values']['consult'],
'exam' => $form_state['values']['exam'],
'test' => $form_state['values']['test'],
'control' => $form_state['values']['control'],
'course' => $form_state['values']['course'],
'gac' => $form_state['values']['gac'],
'diplom' => $form_state['values']['diplom'],
));
$query ->execute();
if ($query > 0) {
drupal_set_message(t('Data has been successfully sent.'));
}
else {
drupal_set_message(t("Data hasn't been sent."), 'error');
}
}
?>
подскажите как добавить оператор REGEXP в db_select()?
addExpression(...)
Наверное надо уточнить что удаление записей (delete, truncate) должно делаться в увязке с другими таблицами
Добрый день. Прими мою благодарность за твои познавательные статьи.
И конечно же вопрос (как без него). Как приджоинить таблицу внешней БД? Гипотетический пример:
Конечно можно прописать вместо other_table что-то типа other_db.other_table, но при смене БД начнется волокита по корректировке всего кода.
Хочу получить массив из такой таблицы (flag c полями)
entity_id | delta | field_competence_tid
5 | 0 | 1
6 | 0 | 1
6 | 1 | 2
затирается одна строка там где ключи совпадают
как получить
array(
'entity_id' => array(
'delta' => 'field_competence_tid',
'delta' => 'field_competence_tid',
'delta' => 'field_competence_tid',
),
'entity_id' => array(
'delta' => 'field_competence_tid',
'delta' => 'field_competence_tid',
'delta' => 'field_competence_tid',
),
....
->fetchAll(); cделал
после перелапачу как надо
xandeadx, подскажи, а как красиво плейсхолдер для полей использовать?
Как такой запрос переделать?
Если сделать так:
В ООП стиле-то понятно:
Но хочется в коде видеть привычный sql-запрос (для собственных внешних данных)
Добрый день.
Вы случайно не сталкивались с такой проблемой, как то, что orderBy не сортирует, как нужно ?
есть функция по запросу к базе данных из модуля "рефералс":
http://pastebin.com/Sq7k1jAJ
надо переделать так чтобы она брала не только referral_uid и с него вытаскивала uid, а чтобы потом подставляла этот uid вместо первоначального referral_uid и процесс повторялся - находя количество рефералов второго уровня, есть проблемы в знаниях БД - по-этому возникаем проблема при апгрейде кода... или не выдает никакой инфы, или выдает ошибку на странице((
да, буду очень благодарен за помощь))
Добрый день! Подскажите, как сделать сортировку, при условии?
Например у комментов есть два поля c.cid и c.pid
c.cid - номер комента
c.pid - уровень комментария (номер комментария к которому был дан ответ)
Сортировка по обоим дает не тот результат:
$query->orderBy('c.cid', 'DESC')
->orderBy('c.pid', 'DESC');
Как правильно сделать сортировку, чтобы сохранялась вложенность комментариев?
http://cgit.drupalcode.org/drupal/tree/modules/comment/comment.module?h=...
А нет ли более простого способа изменить порядок сортировки комментариев (на DESC) сохранив их вложенность?
не в курсе
Нашел более простой способ: https://www.drupal.org/project/comment_goodness :)
В настройках материала можно изменить порядок сортировки. Или клонировать функцию предложенную xandeadx'ом изменив под свои нужды.
Без приведенного выше модуля, в материале нет настроек сортировки комментариев.
Точно. Посмотрел, у меня https://www.drupal.org/project/sort_comments стоит. Он еще dev. Попробую Comment goodness. Благодарю!
Здравствуйте Xandeadx,
Как в callbaсk сделать вывод терминов и заголовки нод.
Подскажите, пожалуйста, а можно ли сделать выборку нод на основе сравнения значений полей?
Например, у нод есть два поля, первое уникальный идентификатор, второй список идентификаторов(как бы идентификаторы нод референсов), нужно взять все значения второго поля и вывести все ноды у которых идентификатор сходится со значением первого поля
да, с помощью оператора IN
Здравствуйте. А подскажите, есть ли такой запрос к базе, благодаря которому можно проверить содержимое страниц на дублирование среди других страниц сайта? То есть надо провести выборку с условием идентичных field_body на страницах. Спасибо.
Подскажите плз, как через db_update сделать такое:
UPDATE table SET field1 = func(field2) WHERE field3 LIKE 'value%'
где func() - некая функция MySQL?
Очень полезная статья. Не раз обращаюсь к ней. Благодарю вас, xandeadx.
Подскажите пож-та, как через dynamic query сделать COUNT(*), как в 10 строке в Drupal 7?
Здравствуйте, xandeadx!
Спасибо за полезную статью.
Столкнулся с проблемой выбора нод по ролям пользователей:
Запрос
выдаёт ошбку
Integrity constraint violation: 1052 Column 'created' in where clause is ambiguous,
что ему не нравится? Заранее благодарю
Можно ли в одном запросе вернуть промежуточное и итоговое значение.
Например:
В запросе мне нужно подсчитать общее количество нод (результат на вывод) и нод с определенным типом (например article).
Или все-таки нужно отправлять два почти одинаковых запроса?
нельзя
А нет ли функции аналогичной fetchObject, но чтобы выводило не объект, а массив с ключами - названиями полей?
fetchAssoc
Спасибо. Зря в текст не добавите fetchAssoc - не такое очевидное название, как кажется.
Я честно признаюсь что я тупой...
я не могу понять как сделать этот запрос на 7ку
-- Генерирует UUID для уже существующих пользователей
максимум что у меня получилось вообще не то что надо но хотя бы заработало...
надо чтобы модуль rules при сохранении(регистрации) пользователя выполнял генерацию uuid. мозг кипит, тонны материала перелопачены и я не профи в работе с кодом, поэтому прошу помощи.
капут, как всё оказывается просто...
я делал по примеру и видимо реально я тупой хДДД
теперь понятно где я косяк!
Спасибо большое за статью. Даже в 2016 году иногда пользуюсь как доступной шпаргалкой.
Статья на вес золота!
Я немножко упорот, но возможно ли с помощью dynamic query сделать что-то типа:
Такой код конечно выдаст синтаксис эррор, но думаю идея ясна, возможно ли динамическое формирование условия?
Или только конкантенация строк?
https://api.drupal.org/comment/21264#comment-21264
xandeadx, спасибо, то что нужно!
Стыд и позор мне раз сам не глянул в комменты db_or()
Может кому пригодится.
Для подсчёта общего количества вариантов в запросе с ограничением на выдачу
$count = $query->countQuery()->execute()->fetchField();
Вставьте перед $query->range. Этот подсчёт не испортит общего запроса и выдаст общее количество вариантов.
Есть таблица, нужно оттуда выбрать два цифровых поля n1 и t1, оба поля неуникальны. Возможно ли так написать запрос через drupal Api, чтобы получить на выходе массив, ключами которого будут уникальные значения первого поля, а значениями - одномерный массив из ключей второго поля?
->fetchAll(PDO::FETCH_COLUMN | PDO::FETCH_GROUP)
Вот бы ещё знать, что подставить вместо PDO::FETCH_COLUMN и PDO::FETCH_GROUP
Сейчас запрос выглядит так
Потом я пробегаюсь по полученному и переформатирую.
Как я понимаю нужно группировать по какому то полю?
Ничего не надо подставлять, это константы.
Да, подошло к первоначальным условиям, когда ещё не было vid - спасибо.
Господа, подскажите, плз, в чем может быть дело?
8 друпал. Код простейший:
Поле a.active - tinyint
При выполнении запроса вылетает ошибка:
То есть почему-то в WHERE "1" подставляется как строка, в кавычках, и, естественно, запрос грохается. Почему так? Как добиться, чтобы она вставлялась нормально, как число, без кавычек?
Помогите, пожалуйста.
Друпал 7.
Скажите, корректен ли такой код:
Мне хотелось отобрать записи по определеному полю таксономии.
В condition первым параметром указывается имя колонки, знак операции в третьем.
В fields второй параметр должен быть массивом.
foreach надо делать по результату запроса, а не по объекту запроса.
В foreach у вас не будет ни id, ни name, потому что ничего этого вы не выбрали в запросе.
В общем читайте всё сначала.
Огромное спасибо за ответ.
У меня все получилось, с учетом ваших замечаний
Подскажите, пожалуйста. (друпал 7)
Нужно:
Определить ноды в словаре с id = 6
Для каждого термина узнать название и количество нод в нем.
Но при условии, что эти ноды типа student_note, а также значение года в поле field_date_beginning_value должно соответствовать текущему году и значение поля field_finished_value должно быть равно 1.
$query = db_select('taxonomy_index', 't');
$query->innerJoin('taxonomy_term_data', 'd', 't.tid = d.tid');
$query->leftJoin('taxonomy_vocabulary', 'v', 'd.vid = v.vid');
$query->leftJoin('node', 'n', 't.nid = n.nid');
$query->leftJoin('field_data_field_date_beginning', 'b', 'b.entity_id = n.nid');
$query->leftJoin('field_data_field_finished', 'f', 'f.entity_id = n.nid');
$query->condition('v.vid', 6);
$query->condition('n.type', 'student_note');
$query->condition('f.field_finished_value', '1');
$query->fields('t', array('nid', 'tid'))
->fields('d', array('vid', 'name'))
->fields('v', array('vid'))
->fields('n', array('nid'))
->fields('f', array('entity_id'))
->where('YEAR(FROM_UNIXTIME(b.field_date_beginning_value)) = :field_date_beginning_value', array(':field_date_beginning_value' => date("Y")))
->groupBy('tid');
$query->addExpression('COUNT(nid)', 'countnode');
$nodes = $query->execute()->fetchAll();
Как можно исправить?
Что исправить?
Здравствуйте!
В таком варианте запрос работает:
$query = db_select('taxonomy_index', 't');
$query->innerJoin('taxonomy_term_data', 'd', 't.tid = d.tid');
$query->leftJoin('taxonomy_vocabulary', 'v', 'd.vid = v.vid');
$query->condition('v.vid', 6);
$query->fields('t', array('nid', 'tid'))
->fields('d', array('vid', 'name'))
->fields('v', array('vid'))
->groupBy('tid');
$query->addExpression('COUNT(nid)', 'countnode');
мне его нужно еще доработать, чтобы запрос работал для конкретных нод типа student_note, значение года в поле field_date_beginning_value должно соответствовать текущему году и значение поля field_finished_value должно быть равно 1.
$nid= db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.title', 'abracadabra')
->execute()
->fetchField();
Эта конструкция выдаcт первую попавшуюся на пути запись. Как сделать так, чтобы выдавала последнюю?
добавить сортировку наверное
Здравствуйте.
Как отменить ранее установленное условие?
->condition('n.nid', 123)
Так там числовые индексы? И у меня в зависимости от раздела, нужный фильтр находится под случайным индексом. Нет ли специального метода, который по имени поля ансетит?
нет
Подскажите, а как найти слово с апострофом в базе по слову без него?
$query->condition('my.field', '%' . db_like($val) . '%', 'LIKE');
Как тут прописать?
Т.е. нужно найти в базе O'STIN, по слову OSTIN.
Оставить комментарий