xandeadx.ru Блог музицирующего веб-девелопера

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:

Написанное актуально для Drupal 7.x
Похожие записи

Комментарии RSS

php5
красава... :)
наконец то. главное с db_delete() не наделать хренотени

Вот это да! Как все намного проще будет делать! ООП рулит!

Вах , блин я седня полвечера убил и ничего по теме не нашел. А твой сайт просто супер ! Drupal 7 вроде недавно появилась, а у тебя уже актуальная информация. Спасибо !

Отличный справочный материал!
Спасибо за статью.

А как реализовать такую конструкцию? $query->condition('YEAR(FROM_UNIXTIME(c.dateborn))', $edit->dateborn_year, '='); Запрос с таким условием не работает, т.к скобки удаляются.

$query->where('YEAR(FROM_UNIXTIME(c.dateborn)) = :dateborn', array(':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?

запрос не возвращает false

это плохо. как узнать что такой запрос не выдаст ничего? неохота делать ещё 1 запрос на кол-во записей. можно конечно сделать проверку на значения переменных после цикла -- но это как-то коряво.

if ($result->rowCount()) ...

Люди подскажите пожалуйста, вот код:

$query = db_select('public.lico', 't1');
$query -> fields('t1');
$query -> condition('t1.key', 30, '>')
       -> condition('t1.key', 50, '<');

Выполнение данного запроса должно вывести двумерный массив, типа:

+---------+-------+-----------+
| Фамилия |  Имя  |  Отчество |
+---------+-------+-----------+
| Иванов  | Иван  | Иванович  |
| Петров  | Петр  | Петрович  |
| Сидоров | Сидор | Сидорович |
+---------+-------+-----------+

Так вот вопрос: подскажите, как мне правильно обойти строки?

Если запрос закончить так:

$result = $query -> execute() -> fetchAssoc();
$output = '';
 
foreach($result as $index => $value) {
  $output = $output.'Индекс элемента массива = '. $index .', значение = '.$value . "<br>";
}

выводит только одну строку...

если написать типа:

$result = $query -> execute();
$output = '';
 
foreach($result as $row) {
  $output = $output. $row->title;
}

Пишет ошибку:

Notice: Undefined property: stdClass::$title...

Объясните, что я делаю не так? Только не пинайте сильно, недавно начал разбираться в друпале...
P.S. БД у меня PostgreSQL

Всё, разобрался. Блин с субботы мучился и никак, а тут раз, и получилось.
Вот как закончил запрос, и вывело так как мне нужно:

$result = $query -> execute();
$output = '';
 
while ($record = $result->fetchAssoc()) { 
    foreach($record as $index => $value) {
        $output = $output.'index = '. $index .', value = '.$value . " | ";
    }
    $output = $output."<br>";
}

З.Ы. Может кому полезно будет, сэкономлю пару минут)

Еще важно для выборок материалов не забывать добавлять тег:

->addTag('node_access');

Здравствуйте, сделал запрос, а вывести не могу, как это делается?
$nodes = db_select('users', 'n')
->fields('n')
->execute();
для начала хоть целеком таблицу вывести, а потом буду копаться как сделать поиск с формы (несколько полей на форме) по таблице.

смотрите пример Обойти записи

подскажите, пожалуйста, как быть с подзапросом:

INSERT INTO table VALUES field = (SELECT field2 FROM table2 WHERE id=$id)

И насколько это правильно. Спасибо

http://xandeadx.ru/blog/drupal/413

И насколько это правильно

не правильно

А что в таком случае будет правильным решением? Спасибо.

Правильно ли так получиться

$subquery = db_select('node', 'n');
    $subquery->fields('n', array('nid'));
    $subquery->condition("n.title = {$node->manufactures}");
 
    $query = db_insert(" field_revision_field_{$node->type}_manufactures", 'f')->fields('f', array
    (
      'entity_type' => 'node',
      'bundle' => $node->type,
      'deleted' => 0,
      'entity_id' => $node->nid,
      'revision_id' => $node->nid,
      'language' => 'und',
      'delta' => 0,
      'field_footwear_type_tid' => manufactures_id,
    ));
    $query->addExpression("({$subquery})", 'manufactures_id');
    $id = $query->execute();

хотел получить:
"INSERT INTO field_revision_field_{$node->type}_manufactures (entity_type, ...) VALUES ('node', ..., (SELECT n.nid FROM node as n WHERE n.title = '$node->manufactures'));";

А что в таком случае будет правильным решением?

сделать два запроса

Как извлечь дату в формате FROM_UNIXTIME(DateTimeStart, '%Y-%m-%d') AS date
поле DateTimeStart формата int.Изменить тип поля в БД нельзя.
Извлечь обычный интегер и потом на стороне пхп преобразовать функцией date тоже нельзя,так по этому полю будет GROUP BY

$query->addExpression("FROM_UNIXTIME(DateTimeStart, '%Y-%m-%d')", 'date');

Блин..тоже самое же делал, и не получалось почему то...
Спасибо;)

Спасибо xandeadx
Отлично вывел "все" примеры работы с базой.

У меня вопрос касательно ->fetchObject()

// Пример 1: выдает объект ноды
$node = db_select('node', 'n')
	->fields('n')
	->condition('n.nid', 6)
	->execute()
	->fetchObject();
 
// Пример 2: выдает объект запроса
$blog = db_select('node', 'n');
$blog
	->leftJoin('field_data_body', 'b', 'b.revision_id = n.vid');
$blog
	->fields('b')
	->condition('n.nid', 6)
	->execute()
	->fetchObject();

Как мне во втором примере получить объект ноды?
Спасибо!

Разобрался сам! Привожу код, может кому поможет.

$query = db_select('node', 'n');
$query
	->leftJoin('field_data_body', 'b', 'b.revision_id = n.vid');
$query
	->fields('b')
	->condition('n.nid', $bid);
 
$result = $query->execute();
$blog = $result->fetchObject();

Подскажите, пожалуйста, как быть с условием IF NOT EXISTS. Спасибо.

И еще с запросом типа:

SELECT IF(условие, истина, лож)

addExpression('IF(условие, истина, лож)')

Спасибо за видео с 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 ..

Выручайте....

для начала неплоха бы запрос предоставить, телепатическими способностями не обладаю

Извините, просто я подумал ведь это для любого вьюсовского запроса, который вытаскивает кастомные поля такая ситуация.. Наверное вьювс потом еще пропускает запрос через какой-то обработчик...

SELECT node.title AS node_title, node.nid AS nid, 'node' AS field_data_body_node_entity_type, 'node' AS field_data_field_delivery_cost_node_entity_type FROM  {node} node

в запросе выбираются заголовки, nid-ы и две строки 'node'. результат ожидаемый

Да уж, наверное так и есть... Тогда вопрос по другому. Можно ли поступить как я говорил, т.е. сгенерировать запрос во вьюхе, скопировать его и использовать? Из моей ситуации, я понимаю, что походу нет.. (в ситуации я запрос упростил значительно, чтобы была понятна суть..)

можно

да, но вот я сгенерил запрос вьюшкой, который типо вытаскивает то, что мне нужно... А на деле, он тащит только нид и тайтл...

В чем может быть проблемма : Когда применяю

$query = db_select('node', 'n');
$query->innerJoin('users', 'u', 'n.uid = u.uid');
$query->fields('n', array('title'));
$query->fields('u', array('name'));
$result = $query->execute();

выдаёт ошибку 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');
А кондишинами так можно сделать?

как получить конкретные значения вместо :db_condition_placeholder_0

вызвать метод execute()

как получить OR вместо AND

http://xandeadx.ru/blog/drupal/88#section-or

вызвать метод execute()

Как-то подготовленный запрос сбил с толку. При выполнении действительно все ок.

http://xandeadx.ru/blog/drupal/88#section-or

Спасибо!

а можно еще и пример с UNION в случае когда в таблицах разное количество полей
делаю так, не получается

$t1= db_select('table1','t1')
        ->fields('t1',array('id','field1'));
$t2 = db_select('table2','t2')
        ->fields('t2',array('id',field2));
$t1 ->union($t2,'UNION ALL');
$result =$t1->execute();

При этом в table1 к примеру 5 полей, а в table2 только 2.

Подскажите пожалуйста, а как правильно сформировать запрос с лайком, например такой:

SELECT title,id,efind_cat FROM {efind_element}  WHERE title LIKE '%ONE%' AND title LIKE '%TWO%'

condition('title', '%' . db_like('ONE') . '%', 'LIKE')

А зачем нужна функция db_like ? читал апи, но как-то недопонимаю..
почему нельзя написать так:

condition('title', '%ONE'%', 'LIKE')

Попробовал, вроде и так работает...

+ подскажите плиз, получается, что в condition по умолчанию используется оператор AND? т.е. если у нас двойное условие через AND, мы просто пишем
->condition1
->condition2

А если условие OR , тогда пользуемся db_or() ?

А зачем тогда нужно db_and() ?

P.S. Спасибо за ценный материал и за сайт!

А зачем нужна функция db_like ?

http://api.drupal.org/api/drupal/includes--database--database.inc/functi...

Escapes characters that work as wildcard characters in a LIKE pattern.

получается, что в condition по умолчанию используется оператор AND?

да

А если условие OR , тогда пользуемся db_or() ?

да

А зачем тогда нужно db_and() ?

чтобы использовать внутри 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

db_query("UPDATE t1, t2 SET t1.user = '145' WHERE ((t1.items=t2.id) and (t2.id=5))");

А как узнать ID последней строки записанной в базу с помощью этих методов?

Например я использую запрос:

db_insert('my_table')
->fields(array(
	'uid' => $user->uid,
	'nid' => $nid,
	'rid' => $rid,
	'text' => $text
))
->execute();

Классическое ПХП предлагает мне использовать mysql_insert_id(), но этой функции как я понял нужен идентификатор соединения с базой, а где его взять?

Либо может есть друпал-вей метод? я нашел только это, но не смог приспособить его к моему запросу: http://drupal.org/node/141926#comment-4536930

db_insert::execute() возвращает id последней вставленной записи http://drupal.org/node/310079

Ого, как все оказалось просто! Спасибо :)

Как засунуть
RAND()
в
->orderBy()

Получилось. спасибо)

а как в запросе
$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

угу спс... уэе разобрался, просто запостил сразу чтобы быстрее помогли, время мало))
вот что получилосб

$stats = db_select('simpleads_clicks', 'sc');
  $stats->addExpression("FROM_UNIXTIME(timestamp, '%Y/%m/%d')", 'ts');
  $stats->addExpression('COUNT(*)', 'count');
  $stats->where("FROM_UNIXTIME(sc.timestamp) <= NOW() AND FROM_UNIXTIME(sc.timestamp) >= SUBDATE(NOW(), INTERVAL 1 MONTH)");
  $stats->condition("sc.nid", 45);
  $stats->groupBy('ts');
  $count = $stats->execute()->fetchAll();

Помогите пожалуйста. Делаю запрос как по документации, но результат шокирующий. Вот запрос:

$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);
}

Но дело в том, что по циклу проходится только один раз, хотя обе записи присутствуют в БД. Что не так?

Но я же делаю как в первом варианте. ПОчему он работает не правильно? Вариант 2 у меня выдает ошибку и скрипт прерывается на строке где execute()

в плейсхолдер надо передавать массив, а не строку

Доброе утро. Направьте вектор мыслей.
Создал таблицу по вот этому примеру.
Вывод таблицы сделал через Views.
1.Не хватает знаний сделать кнопки сортировок для каждого поля
2. Где можно почитать про создание сложных связанных бд с сущностями связками относительно Drupal?

mysql_num_rows($request); - есть аналог?

не могу аонять как правильно использовать drupal_write_record. Как я понял она должна если записи имееться в бд обновлять если нету добавлять новую

таблица имеет следующую структуру

CREATE TABLE `node_type_redirect` (
	`ntrid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'The prinary identificator of redirect.',
	`type` VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'The node_type of this node.',
	`path` VARCHAR(64) NULL DEFAULT '' COMMENT 'Redirect path',
	`status` INT(11) NULL DEFAULT '0' COMMENT 'Redirect path on/off',
	PRIMARY KEY (`ntrid`)
)

использую следующий код
	$record = array(
	  'type' => 'zzzzzzz',
	  'path' => '1113333',
	  'status' => 1,
	);
	$res = drupal_write_record('node_type_redirect', $record, 'type');

это код обновляет запись type если таковая имееться в таблице, если нету новую не добавляет.
следующий код
	$record = array(
	  'type' => 'zzzzzzz',
	  'path' => '1113333',
	  'status' => 1,
	);
	$res = drupal_write_record('node_type_redirect', $record);

добавляет запись в независимости имеется такая или нет.

как сделать чтобы если имеется запись поля type она обновлялась, если нету добавлялась новая?

Как я понял она должна если записи имееться в бд обновлять если нету добавлять новую

не правильно поняли

как сделать чтобы если имеется запись поля type она обновлялась, если нету добавлялась новая?

http://api.drupal.org/api/drupal/includes!database!database.inc/function/db_merge/7

drupal 6.
допустим использую запрос

db_query("UPDATE {node} SET status = %d WHERE nid = %d", 1, 123);

а как мне узнать результат выполнения, т е обновил чтото запрос или нет, и еще например если запрос обновит неск записей (не этот а вообще любой другой) то как узнать какие записи он обновил, ну например мне надо обновить там юзера у всех нгод со статусом 1 и могу ли я потом узнать ид обновленных нод.

подскажите как добавить оператор REGEXP в db_select()?

Чем заменить pager_query c Drupal 6 в Drupal 7 если запрос что бы не переписывать запрос в новую форму?
extend('PagerDefault') не работает с db_query.

пользуйтесь db_select

Привет, а можно подробней объяснить про инкремент значений полей, у меня всплыла задача: нужно переопределить значение авто-инкримента для полей nid и vid например на 1000, потом все материалы пересейвить под новые ниды и виды (1000, 1001 ...), + конечно же не потерять все ривизии для нод, уже более полу дня не могу костыль сей реализовать..

Привет!
Есть такой запрос

SELECT DISTINCT left( name, 1 ) FROM postindex_street ORDER BY name

который возвращает первые буквы поля NAME убирая дубли.

Написал запрос для 7-ой версии

  $query = db_select('postindex_street', 'pstr')
    ->distinct()
    ->fields('pstr')
    ->orderBy('name', 'ASC');
 
  $query->AddExpression('left(name,1)', 'name');
 
  $result = $query->execute();

В итоге получаю результат с дублями, такое ощущение что ->distinct() не сработал.

Хотя если напишу запрос по старинке

$result = db_query('SELECT DISTINCT left( name, 1 ) 
                                   FROM postindex_street 
                                   ORDER BY name');

все работает замечательно, т.е. выводит первые буквы поля без дублей.

Может кто подсказать что с моим запросом под 7-ку нет?

Сам разобрался. Убрал ->fields('pstr') и все заработало.

Использую hook_query_alter чтобы немного подправить существующий системный запрос.
Столкнулся с необходимостью очистить уже существующее условие WHERE чтобы запилить на его место своё условие выборки. Делаю

	$where =& $query->conditions();
        unset($where); 

не работает. Как правильно?
Нашел пример для groupBy http://www.brenthartmann.com/blog/how-use-hookqueryalter-drupal-7
Но как сделать аналогично для where не понимаю

$where = &$query->where();

Если делаю

		$where = &$query->where();
		 unset($where); 

Получаю ошибку:
Warning: Missing argument 1 for SelectQueryExtender::where(), called in /usr/local/www/m500.by/sites/all/modules/mymodule/mymodule.module on line 33 and defined в функции SelectQueryExtender->where() (строка 626 в файле /usr/local/www/m500.by/includes/database/select.inc).
Notice: Undefined variable: snippet в функции SelectQueryExtender->where() (строка 627 в файле /usr/local/www/m500.by/includes/database/select.inc).
Strict warning: Only variables should be assigned by reference в функции mymodule_query_node_access_alter() (строка 33 в файле /usr/local/www/m500.by/sites/all/modules/mymodule/mymodule.module).
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY t.sticky DESC, t.created DESC LIMIT 10 OFFSET 0' at line 1: SELECT t.nid AS nid, t.tid AS tid, t.sticky AS sticky, t.created AS created FROM {taxonomy_index} t WHERE (tid = :db_condition_placeholder_1) AND () ORDER BY t.sticky DESC, t.created DESC LIMIT 10 OFFSET 0; Array ( [:db_condition_placeholder_1] => 125 ) в функции PagerDefault->execute() (строка 79 в файле /usr/local/www/m500.by/includes/pager.inc).

EntityFieldQuery http://drupal.org/node/1343708
тоже хорошая вещь для работы с базой данных

помогите , плиз. надо организовать элементарный запрос :

SELECT count(*) FROM affiliate_users_ids WHERE UCASE(text_id)=UCASE($Var)

вместо $Var надо подставить кое - что (в запросе ниже это txt). бьюсь весь день как организовать это на языке друпал . пытаюсь так :

db_select('affiliate_users_ids')
  ->countQuery()
  ->where('UCASE(text_id)=UCASE(:txt)', array(':txt' => $textid_primay_part . $textid_cnt . $textid_secondary_part))
  ->execute()
  ->fetchField()

но выдаёт ошибку :

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).

EntityFieldQuery http://drupal.org/node/1343708
тоже хорошая вещь для работы с базой данных

xandeadx об этом уже давно (Опубликовано в пт, 01/04/2011 - 15:48) написал: Как получить список нод определённого типа со всеми полями

Прошу помощи необходимо выполнить запрос: выбрать записи, где значение поля 1 не равно значению поля 2 из одной таблицы, причем выполнение реализовано в общей массе , те пытался:
$query->condition( 'n.field1',  'n.field2', '!=');
но, естественно не работает ((

Добрый вечер!
У меня есть тип материала "категории" который представляет из себя обычный chekbox, как мне поучить все значения этого типа? Я хочу заполнить форму checkboxes. Чтобы мне не писать значения вручную я хочу сделать запрос.

У меня есть тип материала "категории"...

$nodes = db_select('node', 'n')
  ->fields('n', array('nid', 'title'))
  ->condition('n.type', 'categories')
  ->execute()->fetchAll();
 
debug($nodes);

Подскажите пожалуйста как вывести текущую дату плюс 2 дня: в блоке. Если вывожу date("d")+2 то получаю например 32 марта. Извините за нубовский вопрос php только начал изучать но я так понимаю это надо через запрос к бд делать?

Приветствую!
Можете подсказать как использовать функцию concat в select для объединения двух полей из разных таблиц?
Привожу пример для наглядности.

SELECT pa.code, concat( pr.name, ', ', pa.name ) , pa.postindex
FROM postindex_area pa
JOIN postindex_region pr ON pa.code_region = pr.code

addExpression(...)

to xandeadx: Спасибо за ответ.

Возник еще один вопрос. В JOIN мне надо сделать проверку с использованием строковой функции LEFT, например:

SELECT pa.code, concat( pr.name, ', ', pa.name ) , pa.postindex
FROM postindex_area pa
JOIN postindex_region pr ON LEFT(pa.code, 2) = pr.code)

Принимает ли функция join строковую функцию SQL в условиях проверки?

Я написал так, но что-то join не отрабатывает условие как надо:

  $query->Join('postindex_region', 'pr', 'LEFT(pa.code, 2) = pr.code');

Снимаю свой вопрос. Все работает.

Возникла необходимость фильтровать по полю varchar.

Но есть проблема: при генерации запроса друпал обрамляет значения в апострофы и это неправильно сказывается на результате.
Что делаю:

$query->add_where(0, 
 db_and()  
  ->condition($table3.".field_value_value", min($value), '>=')
  ->condition($table3.".field_value_value", max($value), '<=')
  ->condition($table6.".field_label_value", $label, '=')
);

Получаю:

WHERE ((( (field_data_field_value.field_value_value >= '14') AND (field_data_field_value.field_value_value <= '22') AND (field_data_field_label.field_label_value = 'Длина') )AND( (field_data_field_value_1.field_value_value >= '5') AND (field_data_field_value_1.field_value_value <= '13') AND (field_data_field_label_1.field_label_value = 'Диаметр')...

Как заставить друпал генерировать запрос без кавычек в значениях. Иначе результат получается неверным.

кавычки не влияют на результат

Попробуйте. Еще как влияют
С кавычками он ищет последовательность:
1,11,12,2
Без кавычек:
1,2,11,12

Решение найдено:

$this->query->add_where_expression(0, "$table3.field_value_value >= $min AND $table3.field_value_value <= $max AND $table6.field_label_value = '$label'");

	$query = db_select('index', 'n');
	$query->innerJoin('offer', 'o', 'n.nid = o.entity_id');
	$query->leftJoin('product', 'p', 'n.nid = p.entity_id');
	$query->fields('n', array('nid'));
 
	$query->condition('offer_tid', $geo_id, 'in');      // condition №1
 
	$query->condition(                                  // condition №2
			db_or()			  
			  ->condition('product_tid', $geo_id, 'in')
			  ->condition('product_tid', null)
		  );

Помоги пожалуйста реализовать условие для выполнения condition:

1. если в leftJoin были подключены null значения, то должна срабатывать только condition №1
2. если в leftJoin были подключены не null значения, то должна срабатывать только condition №2.

Проблема в том, что сейчас condition срабатывают вместе.

рабрался:

$query->where('ifnull (p.product_tid IN (:geo_id)), o.offer_tid IN (:geo_id))', array(':geo_id' => $geo_id));

Можете помощь мне разобраться с заданием которые дали мне на новым работе. Мне дали таблицу в Word формате и сказали перевести это на Веб страницу которые преподаватели могли заполнят формы и так в таблице(как Word таблицы) вывести результат. Я создал страницы которые можно заполнять информация ми (с помощи Webform). Но я не могу вывести результат как мне хотелось. Тогда я спросил как можно повлиять на выведенное данных. Они сказали с помощи База данных, но я не могу как это понят потому что у меня нет понятие как и где писать SQL Query? , но у меня есть роль админа. Можете помочь мне, просто хочу сдать задание вовремя и делать хорошо как они дали. Только не пинайте сильно, недавно начал разбираться в друпале . Спасибо я буду ждать и искать пока не сделаю это.

читайте про модуль views

Спасибо, сайт создан на Drupal 6, есть отличи в views

Скажите пожалуйста, а существует ли на данном этапе способ принудительно задавать порядок выводимых полей в запросе ?

А то, как я заметил, сначала будут выводиться именно поля (созданные с помощью addField), а потом - выражения (addExpression), даже если при построении query вызывать эти функции вразнобой.

Просто если не задавать порядок полей принудительно, то могут быть проблемы при построении UNION - запросов.

Всем привет!
Использую вот такой снипет для вывода определенного типа материала

$type = 'page';  // Выбираются новости по типу
 
$num_nodes = '3'; // Количество выводимых материалов
 
// Запрос к БД на предмет последних новостей
 
$sql = "SELECT n.nid, n.title, n.created, nr.teaser
FROM {node} n 
LEFT JOIN {node_revisions} nr ON n.vid = nr.vid
WHERE n.status = 1 
AND n.type in (". db_placeholders($type, 'text') .")
ORDER BY n.created DESC";
 
$result = db_query_range($sql, $type, 0, $num_nodes);
 
// Формат даты 
// $dateSQL = format_date($dateUnix, 'custom', 'Y-m-d', 0);
// $datePretty = format_date($dateUnix, 'medium', '', 0);
 
while ($n = db_fetch_object($result)) {
$output1 = '<div class="left-news-date">' . format_date($n->created, 'custom', 'd.m.Y', 0) . '</div>';
$output2 = l($n->title, 'node/' . $n->nid);
 
/* Что бы все было аккуратно, ровно, и текст тизера был действительно похож на текст анонса, удалим из него ненужные пока теги функцией strip_tags(), и «подровняем» текст до еще более точно заданного количества символов в нем функцией truncate_utf8()(в коде примера - до 200 символов). 
 
Тут, конечно, было бы уместнее использовать текст ноды целиком, но мы «запросили» у базы именно тизер, посему используем его(для наглядности описываемых действий достаточно). Если дополнительная обработка текста не нужно, то ниже закомментирован код вывода текста тизера «как он есть», раскомментируйте его и закомментируйте текущий. 
$output .= $n->teaser;
*/
$output3 = '<div>' . truncate_utf8(strip_tags($n->teaser), 200, TRUE, TRUE) . '</div>';
print '<div class="left-menu-news">';
print $output1; 
print $output2; 
print $output3; 
print '</div>';
$countx++;
if($countx < 3) echo '<hr class="hr-left">';
 
};

сайт двуязычный а он выводит все подряд тоесть по очередности создания материала подскажите пожалуйста как сделать чтобы вывод зависил от языка

Добрый день!
есть таблица "план", есть таблица "пользователи"
подскажите, пожалуйста, как запомнить значение (имя пользователя), выбранное в 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) должно делаться в увязке с другими таблицами

Добрый день. Прими мою благодарность за твои познавательные статьи.
И конечно же вопрос (как без него). Как приджоинить таблицу внешней БД? Гипотетический пример:

$query = db_select('table', 't')
  ->fields('o', array('rec_id', 'status'))
  ->where('t.status <> o.status');
$query->innerJoin('other_table', 'o', 'o.id = t.rec_id');
$result = $query->execute()->fetchAllAssoc('id');

Конечно можно прописать вместо other_table что-то типа other_db.other_table, но при смене БД начнется волокита по корректировке всего кода.

Хочу получить массив из такой таблицы (flag c полями)
entity_id | delta | field_competence_tid
5 | 0 | 1
6 | 0 | 1
6 | 1 | 2

 $result = db_select('field_data_field_competence', 'fc')
        ->fields('fc',array('entity_id','delta', 'field_competence_tid'))
             ->execute()
       // ->fetchAllKeyed();
      //  ->fetchAssoc();
           ->fetchAllAssoc('entity_id');

затирается одна строка там где ключи совпадают

как получить
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, подскажи, а как красиво плейсхолдер для полей использовать?

Как такой запрос переделать?

$field = 'title';
$result = db_query("SELECT $field FROM {node}")->fetch(); 

Если сделать так:
$result = db_query("SELECT :field FROM {node}", array(':field' => $field))
->fetch();
Получим всего лишь:
stdClass Object
(
    [title] => title
)

В ООП стиле-то понятно:

$field = 'title';
$result = db_select('node', 'n')->fields('n', array($field))
->execute()->fetch();

Но хочется в коде видеть привычный sql-запрос (для собственных внешних данных)

$result = db_query("SELECT " . db_escape_field($title) . " FROM {node}")
->fetch();

Добрый день.

Вы случайно не сталкивались с такой проблемой, как то, что 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');

Как правильно сделать сортировку, чтобы сохранялась вложенность комментариев?

А нет ли более простого способа изменить порядок сортировки комментариев (на DESC) сохранив их вложенность?

не в курсе

Нашел более простой способ: https://www.drupal.org/project/comment_goodness :)

В настройках материала можно изменить порядок сортировки. Или клонировать функцию предложенную xandeadx'ом изменив под свои нужды.

Без приведенного выше модуля, в материале нет настроек сортировки комментариев.

Точно. Посмотрел, у меня https://www.drupal.org/project/sort_comments стоит. Он еще dev. Попробую Comment goodness. Благодарю!

Здравствуйте Xandeadx,
Как в callbaсk сделать вывод терминов и заголовки нод.

function jqe_autocomplete_ajax() {
  // Запрашиваем данные из бд.
  // fetchAll даст нам список объектов с выбранными полями таблицы в качестве свойств.
  $query = db_select('taxonomy_term_data', 'ttd');
  // вместо следующей строки здесь join c нужными таблицами для подключения каких-либо полей терминов
  // $query->innerJoin('node_type', 'nt', 'n.type = nt.type');
  $terms = $query->fields('ttd', 'title' array('name'))
      ->fields('join-таблица', array('нужное поле', 'нужное поле2', 'и т.д.'))
      ->condition('ttd.name', 'n.title' '%' . db_like($_POST['input']) . '%', 'LIKE')
      ->orderBy('ttd.name', 'n.title' 'DESC')
      ->range(0, $_POST['maxItems'])
      ->execute()->fetchAll();
 
$result_array = array();

Подскажите, пожалуйста, а можно ли сделать выборку нод на основе сравнения значений полей?
Например, у нод есть два поля, первое уникальный идентификатор, второй список идентификаторов(как бы идентификаторы нод референсов), нужно взять все значения второго поля и вывести все ноды у которых идентификатор сходится со значением первого поля

Подскажите, пожалуйста, а можно ли сделать выборку нод на основе сравнения значений полей?
Например, у нод есть два поля, первое уникальный идентификатор, второй список идентификаторов(как бы идентификаторы нод референсов), нужно взять все значения второго поля и вывести все ноды у которых идентификатор сходится со значением первого поля

да, с помощью оператора IN

Здравствуйте. А подскажите, есть ли такой запрос к базе, благодаря которому можно проверить содержимое страниц на дублирование среди других страниц сайта? То есть надо провести выборку с условием идентичных field_body на страницах. Спасибо.

Подскажите плз, как через db_update сделать такое:

UPDATE table SET field1 = func(field2) WHERE field3 LIKE 'value%'

где func() - некая функция MySQL?

->expression('field1', 'func(field2)')

Очень полезная статья. Не раз обращаюсь к ней. Благодарю вас, xandeadx.

SELECT 
	school.id,
	school.num AS 'School num', 
	school.region_code, 
	region.type, 
	region.name, 
	school.city_code, 
	city.type, 
	city.name,
	(SELECT COUNT(*) FROM mainstuff_profile AS profile WHERE profile.school_id=school.id) AS 'Registrations'
FROM mainstuff_school AS school
	JOIN mainstuff_kladr_regions AS region ON school.region_code=region.code 
	JOIN mainstuff_kladr_cities AS city ON school.city_code=city.code

Подскажите пож-та, как через dynamic query сделать COUNT(*), как в 10 строке в Drupal 7?

Здравствуйте, xandeadx!
Спасибо за полезную статью.
Столкнулся с проблемой выбора нод по ролям пользователей:

Запрос

$m_week_articles = db_query('SELECT count(type) FROM {node} node LEFT JOIN {users} users_node ON node.uid = users_node.uid INNER JOIN {users_roles} users_node__users_roles ON users_node.uid = users_node__users_roles.uid WHERE node.status = 1 AND node.type = :article AND (created BETWEEN :start_time AND :end_time)', array(':start_time' => $last_week, ':end_time' => $today, ':article' => $type))
        ->fetchAll();

выдаёт ошбку
Integrity constraint violation: 1052 Column 'created' in where clause is ambiguous,
что ему не нравится? Заранее благодарю

Можно ли в одном запросе вернуть промежуточное и итоговое значение.
Например:
В запросе мне нужно подсчитать общее количество нод (результат на вывод) и нод с определенным типом (например article).

$query = db_select('node', 'n')
  ->condition('n.type', 'article')
  ->execute()
  ->fetchAll();
$query->addExpression('COUNT(*)');
$count = $query->execute()->fetchField();

Или все-таки нужно отправлять два почти одинаковых запроса?

нельзя

А нет ли функции аналогичной fetchObject, но чтобы выводило не объект, а массив с ключами - названиями полей?

fetchAssoc

Спасибо. Зря в текст не добавите fetchAssoc - не такое очевидное название, как кажется.

Я честно признаюсь что я тупой...
я не могу понять как сделать этот запрос на 7ку
-- Генерирует UUID для уже существующих пользователей

UPDATE users SET uuid=(SELECT UUID()) WHERE uuid IS NULL;

максимум что у меня получилось вообще не то что надо но хотя бы заработало...

db_update('users')
  ->fields(array('uuid' => '329809b1-07ac-11e6-b4ec-d050991881da'))
  ->condition('uid', 98, '=')
  ->execute();
print_r(' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

надо чтобы модуль rules при сохранении(регистрации) пользователя выполнял генерацию uuid. мозг кипит, тонны материала перелопачены и я не профи в работе с кодом, поэтому прошу помощи.

db_query("UPDATE users SET uuid=(SELECT UUID()) WHERE uuid IS NULL");

капут, как всё оказывается просто...
я делал по примеру и видимо реально я тупой хДДД

db_query("UPDATE {users} SET uuid=(SELECT UUID()) WHERE uuid IS NULL;

теперь понятно где я косяк!

Спасибо большое за статью. Даже в 2016 году иногда пользуюсь как доступной шпаргалкой.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании