Drupal → Работа с базой данных

30.03.2010

Выборка с условием:

// 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();

// Drupal 8+
$nodes = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n', ['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();

// Drupal 8+
$query = \Drupal::database()->select('node_field_data', 'n');
$query->innerJoin('users_field_data', 'u', 'n.uid = u.uid'); // <--
$query->fields('n', ['title']);
$query->fields('u', ['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(); // <--
  
// Drupal 8+
$title = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n', ['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 8+
$node = \Drupal::database()
  ->select('node_field_data', '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 8+, вариант 1
$count = \Drupal::database()
  ->select('node_field_data', 'n')
  ->condition('n.uid', 1)
  ->countQuery() // <--
  ->execute()
  ->fetchField();
  
// Drupal 8+, вариант 2
$query = \Drupal::database()->select('node_field_data');
$query->addExpression('COUNT(*)'); // <--
$count = $query->execute()->fetchField();

Найти минимальное значение:

// Drupal 6
$min = db_result(db_query("SELECT MIN(fieldname) FROM {tablename}"));

// Drupal 7, static query
$min = db_query("SELECT MIN(fieldname) FROM {tablename}")->fetchField();

// Drupal 7, dynamic query
$query = db_select('tablename');
$query->addExpression('MIN(fieldname)'); // <--
$min = $query->execute()->fetchField();

// Drupal 8+
$query = \Drupal::database()->select('tablename');
$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 8+
$nodes = \Drupal::database()
  ->select('node_field_data', '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 $row) {
  $items[] = $row->title;
}

// Drupal 8+
$result = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n')
  ->execute();
foreach ($result as $row) {
  $items[] = $row->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 8+
\Drupal::database()
  ->update('node_field_data')
  ->fields(['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 8+
\Drupal::database()
  ->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 8+
\Drupal::database()
  ->delete('node_field_data')
  ->condition('uid', 1)
  ->condition('created', time() - 3600, '<')
  ->execute();

Очистка таблицы (удаление всех данных из таблицы):

// Drupal 6, Drupal 7 static query
db_query("TRUNCATE {watchdog}");

// Drupal 7, dynamic query
db_truncate('watchdog')->execute();

// Drupal 8+
\Drupal::database()->truncate('watchdog')->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 8+
$id = \Drupal::database()
  ->insert('mytable')
  ->fields([
    'intvar' => 5,
    'stringvar' => 'hello world',
    'floatvar' => 3.14,
  ])
  ->execute();

Использование логического оператора OR в условии:

// Drupal 6
$nodes = db_query("
  SELECT *
  FROM {node}
  WHERE type = 'page' AND (uid = %d OR status = %d)
", 1, 0);

// Drupal 7, static query
$nodes = db_query("
  SELECT *
  FROM {node}
  WHERE type = 'page' AND (uid = :uid OR status = :status)
", array(':uid' => 1, ':status' => 0))->fetchAll();

// Drupal 7, dynamic query
$nodes = db_select('node', 'n')
  ->fields('n')
  ->condition('n.type', 'page')
  ->condition(
    db_or()
      ->condition('n.uid', 1)
      ->condition('n.status', 0)
  )
  ->execute()
  ->fetchAll();
  
// Drupal 8+
$query = \Drupal::database()
  ->select('node_field_data', 'n');
  ->fields('n')
  ->condition('n.type', 'page');
$or_conditions = $query->orConditionGroup();
$or_conditions->condition('n.uid', 1);
$or_conditions->condition('n.status', 0);
$query->condition($or_conditions);

Использование оператора 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();
  
// Drupal 8+
$nodes = \Drupal::database()
  ->select('node_field_data', '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();
  
// Drupal 8+
$nodes = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n')
  ->condition('n.title', '%' . \Drupal::database()->escapeLike('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();
  
// Drupal 8+
$nodes = \Drupal::database()
  ->select('node', 'n')
  ->fields('n')
  ->condition('n.nid', [123, 456], 'BETWEEN')
  ->execute()
  ->fetchAll();

Проверка значения на NULL:

// Drupal 6, Drupal 7 static query
$result = db_query("SELECT * FROM {tablename} WHERE fieldname IS NULL");

// Drupal 7, dynamic query, вариант 1
$result = db_select('tablename', 't')
  ->fields('t')
  ->condition('t.fieldname', NULL, 'IS NULL')
  ->execute();

// Drupal 7, dynamic query, вариант 2
$result = db_select('tablename', 't')
  ->fields('t')
  ->isNull('t.fieldname')
  ->execute();
  
// Drupal 8+
$result = \Drupal::database()
  ->select('tablename', 't')
  ->fields('t')
  ->isNull('t.fieldname')
  ->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 8+
$nodes = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n')
  ->where('YEAR(FROM_UNIXTIME(n.created)) = :created', [':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 8+
$nodes = \Drupal::database()
  ->select('node_field_data', '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 8+
$nids = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n', ['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 8+
$nids = \Drupal::database()
  ->select('node', 'n')
  ->fields('n', ['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();
  
// Drupal 8+
$titles = \Drupal::database()
  ->select('node_field_data', 'n')
  ->fields('n', ['nid', 'title'])
  ->execute()
  ->fetchAllKeyed();

Полный мануал с кучей примеров есть на официальном сайте — Database API.

Написанное актуально для
Drupal 6, Drupal 7, Drupal 8+
Похожие записи

Комментарии

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

Попробуйте. Еще как влияют
С кавычками он ищет последовательность:
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? , но у меня есть роль админа. Можете помочь мне, просто хочу сдать задание вовремя и делать хорошо как они дали. Только не пинайте сильно, недавно начал разбираться в друпале . Спасибо я буду ждать и искать пока не сделаю это.

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

Роман
18.12.2013, 19:11

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

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

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

Гость
17.02.2014, 13:11

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

$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">';
 
};

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

Гость
19.05.2014, 17:26

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

Гость
09.07.2014, 15:12

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

Гость
17.07.2014, 02:07

Наверное надо уточнить что удаление записей (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делал
после перелапачу как надо

Гость
19.11.2014, 13:42

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();
Роман
08.01.2015, 19:17

Добрый день.

Вы случайно не сталкивались с такой проблемой, как то, что orderBy не сортирует, как нужно ?

есть функция по запросу к базе данных из модуля "рефералс":

http://pastebin.com/Sq7k1jAJ

надо переделать так чтобы она брала не только referral_uid и с него вытаскивала uid, а чтобы потом подставляла этот uid вместо первоначального referral_uid и процесс повторялся - находя количество рефералов второго уровня, есть проблемы в знаниях БД - по-этому возникаем проблема при апгрейде кода... или не выдает никакой инфы, или выдает ошибку на странице((

да, буду очень благодарен за помощь))

Гость
21.04.2015, 11:41

Добрый день! Подскажите, как сделать сортировку, при условии?
Например у комментов есть два поля c.cid и c.pid
c.cid - номер комента
c.pid - уровень комментария (номер комментария к которому был дан ответ)

Сортировка по обоим дает не тот результат:
$query->orderBy('c.cid', 'DESC')
->orderBy('c.pid', 'DESC');

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

Гость
21.04.2015, 12:27

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

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

Гость
21.04.2015, 12:54

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

Здравствуйте 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();
Гость
04.08.2015, 07:24

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

Гость
04.08.2015, 11:14

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

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

Гость
10.08.2015, 00:58

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

Гость
13.08.2015, 22:45

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

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

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

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

Гость
23.10.2015, 10:20
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?

Алексанрд
05.11.2015, 12:20

Здравствуйте, 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,
что ему не нравится? Заранее благодарю

Артем
03.02.2016, 09:42

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

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

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

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

Спасибо. Зря в текст не добавите 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;

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

Сергей
06.06.2016, 10:19

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

Я немножко упорот, но возможно ли с помощью dynamic query сделать что-то типа:

  $query = db_select('table', 't')
  ->fields('t', array('field'))
  ->condition(
    db_or()

    foreach ($values as $value) {
      ->condition('t.field', db_like($value) . '%', 'LIKE')      
    }
    
    )
  ->execute()
  ->fetchAll();

Такой код конечно выдаст синтаксис эррор, но думаю идея ясна, возможно ли динамическое формирование условия?
Или только конкантенация строк?

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

Сейчас запрос выглядит так

		$query=db_select('field_data_taxonomyextra','t')
                        ->fields('t', array('entity_id','taxonomyextra_tid'));
		$query->innerJoin('taxonomy_term_data', 'td', 't.taxonomyextra_tid = td.tid');
		$query->fields('td', array('vid'));
	  $rows=$query->execute()->fetchAll(); 

Потом я пробегаюсь по полученному и переформатирую.

Как я понимаю нужно группировать по какому то полю?

Ничего не надо подставлять, это константы.

Да, подошло к первоначальным условиям, когда ещё не было vid - спасибо.

Гость
08.02.2018, 06:57

Господа, подскажите, плз, в чем может быть дело?
8 друпал. Код простейший:

 
    $query1 = \Drupal::database()->select('my_table', 'a');
    $query1->fields('a', ['field1', 'field2']);
    $query1->condition('a.active', 1);
    $spopl = $query1->execute()->fetchAllKeyed();

Поле a.active - tinyint
При выполнении запроса вылетает ошибка:

 
Drupal\Core\Database\DatabaseExceptionWrapper: 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 'WHERE a.active = '1'' at line 1:
SELECT a.field1 AS field1, a.field2 AS field2 FROM {my_table} a WHERE a.active = :db_condition_placeholder_0; Array ( [:db_condition_placeholder_0] => 1 )

То есть почему-то в WHERE "1" подставляется как строка, в кавычках, и, естественно, запрос грохается. Почему так? Как добиться, чтобы она вставлялась нормально, как число, без кавычек?

Алексей
15.02.2018, 17:52

Помогите, пожалуйста.
Друпал 7.
Скажите, корректен ли такой код:

<?php 
$query_cpu = db_select('node', 'n');  
$query_cpu->condition('t.tid=','315');
$query_cpu->fields('n','title');
$query_cpu->innerJoin('taxonomy_index','t','n.nid = t.nid');
$result = $query_cpu->execute();
 
foreach ($query_cpu as $node_cpu) {
  $rows_cpu[] = array($node_cpu->id, $node_cpu->name);
}
$output_cpu = theme('table', array('header' => $header_cpu, 'rows' => $rows_cpu));
echo $output_cpu; 

?>

Мне хотелось отобрать записи по определеному полю таксономии.

В condition первым параметром указывается имя колонки, знак операции в третьем.
В fields второй параметр должен быть массивом.
foreach надо делать по результату запроса, а не по объекту запроса.
В foreach у вас не будет ни id, ни name, потому что ничего этого вы не выбрали в запросе.

В общем читайте всё сначала.

Алексей
15.02.2018, 20:05

Огромное спасибо за ответ.
У меня все получилось, с учетом ваших замечаний

$query_cpu = db_select('node', 'n');  
$query_cpu->condition('t.tid','315','=');
$query_cpu->fields('n',Array('nid', 'title'));
$query_cpu->fields('t',Array('tid'));
$query_cpu->fields('p',Array('field_price_value'));
$query_cpu->fields('s',Array('field_parts_set_value'));
$query_cpu->innerJoin('taxonomy_index','t','n.nid = t.nid');
$query_cpu->innerJoin('field_data_field_price','p','n.nid = p.entity_id');
$query_cpu->innerJoin('field_data_field_parts_set','s','n.nid = s.entity_id');
$result = $query_cpu->execute();
 
foreach ($result as $node_cpu) {
  $rows_cpu[] = array($node_cpu->nid, $node_cpu->title, $node_cpu->tid, $node_cpu->field_price_value,$node_cpu->field_parts_set_value  );
}
$output_cpu = theme('table', array('header' => $header_cpu, 'rows' => $rows_cpu));
echo $output_cpu; 

Подскажите, пожалуйста. (друпал 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т первую попавшуюся на пути запись. Как сделать так, чтобы выдавала последнюю?

Гость
22.04.2019, 20:54

Здравствуйте.
Как отменить ранее установленное условие?

->condition('n.nid', 123)

$conditions = &$query->conditions();
unset($conditions[...]);
Гость
22.04.2019, 23:09

Так там числовые индексы? И у меня в зависимости от раздела, нужный фильтр находится под случайным индексом. Нет ли специального метода, который по имени поля ансетит?

Подскажите, а как найти слово с апострофом в базе по слову без него?
$query->condition('my.field', '%' . db_like($val) . '%', 'LIKE');
Как тут прописать?
Т.е. нужно найти в базе O'STIN, по слову OSTIN.

Виктор
15.05.2021, 20:23

Тока не удаляйте эту страницу ещё лет 10.
Подглядываю сюда уже лет 10. Подглядывал, подглядываю и буду подглядывать.

Привет :) Может комменты отсортировать чтобы последние были первыми?
Решил проитать что народ пишет, а в начале 2012 год про пиХАпи 5 )))))))))

Ошибся в пред. комменте - 2010 год в начале.

Чуть поправить в "Получить значение поля у единственной записи:"
$title = \Drupal::database('node_field_data', 'n')
$title = \Drupal::database()->select('node_field_data', 'n')

А из SQL Views можно получить выборку?

Петро
02.07.2022, 05:40

Как зделать выборку по uid?
db_insert('users')
->fields(array('balance'))
->values(array(
'balance' => $balance,
))
->execute();

Найти минимальное значение:

В Drupal 9 эта строка дает ошибку
$query->addExpression('MIN(fieldname)'); // <--

А вот так работает
$query->addExpression('MIN("fieldname")', 'fieldname');

Добавить комментарий