Наверх

DataBase API Drupal 7.Работа с базой данных в седьмом друпале.

В седьмом друпале для работы с базой данных можно использовать специальное API.
Его преимущества-это:простота написания кода,кроссплатформенность написаных запросов, сведение к минимуму ошибок.
Из личного опыта:было написано порядка 10 сложных самописных модулей, написаных с использованием DataBase API Drupal 7, и работающих на MySql.
После переноса сайта на MsSql, с использование технологии Microsoft Azure - потребовалось внести мелкие поправки всего в несколько запросов,а не переписывать по 10-20 запросов в каждом модуле.
Примеры работы в шестой версии Drupal рассматривать не будем, только для 7.

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

//Выборка данных
db_select('table_name','t');
 
//апдейт
db_update('table_name');
 
//удаление
db_delete('table_name');
 
//вставка
db_insert('table_name');

Пояснение:всем этим четырем функциям вкачестве первого аргумента передается название таблицы, без префикса.
В первом случае,с выборкой, вторым аргументом указывается псевдоним данный таблицы,он обязателен даже при выборке из одной таблицы. Указывайте любой, например первая буква в названии таблицы.

//оператор условия
condition('ячейка','значение','оператор');

Это замена привычного вам where.

//Тоесть если надо написать чтото типа 
where table.user_id=50
 
//То пишем:
condition('table.user_id',50,'=');

По умолчанию знак равенства можно не ставить.Но если нужно использовать оператор больше,меньше,меньше или равно и т.п. - вместо знака "=" ставите ">" , к примеру.

Но и привычный where никто не запрещал.Используется так,тут попроще.

where('YEAR(FROM_UNIXTIME(date_1)) = :my_data', array(':my_data' => 2012));

В объяснении, думаю, не нуждается.

Выборка полей,оператор fields:

fields('псевдоним таблицы',array('поле_1','поле_2'));
//например
fields('o',array('DateTimeStart','UserID'));

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

Сортировка:

orderBy('ячейка','порядок сортировки');
//например
orderBy('o.DateTimeStart','asc');

Группировка:

groupBy('ячейка_1 , ячейка_2');
//например
groupBy('o.DateTimeStart, o.UserID');

Подсчет количество строк:

addExpression('count(*)','псевдоним');
//например
addExpression('count(*)','total_views');

Условия в запросе:

addExpression('условие','псевдоним');
//например
addExpression('if(i.nid>0,1,0)','est');
//пояснение: если поле nid из таблицы с псевдонимом i больше 0, то 
//ячейка est будет равна 1, иначе 0.

Выборка из нескольких таблиц-он же join

leftJoin('имя таблицы','её псевдоним','условие');
 
//подробнее. на sql
left join 'table_2' as t2 
on t2.pole=t1.znach 
 
//на drupal это выглядит вот так
leftJoin('table_2','t2','t2.pole=t1.znach');
 
//тоесть джоиним таблицу table_2 по полю pole
//точно также используются rightJoin и innerJoin

Выполнение запроса

execute();

Вот в основном это всё.Теперь как это всё работает.

//устанавливаем связь с таблицей cb_stats_sess
$q=db_select('cb_stats_sess','s');
 
//пишем условие
$q->condition('s.PlayerID',15,'>=');
 
//выбираем поля
$q->fields('s',array('UserName','UserID','DateRegister'));
 
//сортируем по дате регистрации
$q->orderby('s.DateRegister');
 
//отрабатываем запрос
$res=$q->execute();
 
//отображаем данные
while($rec=$res->fetchAssoc()){
	echo $rec['UserName'].' - '.$rec['DateRegister'].' : '.$rec['UserID'].'<br />';
}

Вот в принципе и всё.
Оператор having, например, тоже очень легко отрабатывается.

Оператор limit. Заменен на range

range(0,'количество');
//например извлечь первые 30 записей
range(0,30);

Я приведу пример нескольких реальных запросов,чтоб на примере вам было понятно как всё это действует:

Простая выборка данных:

// соединение с бд,подключение пагинации
$q	=db_select('cb_stats_sessionss','s')->extend('PagerDefault');
 
//джоиним таблицы
$q	->leftjoin('cb_stats_videos', 'v', 's.VideoID = v.ID');
$q	->leftjoin('cb_node_guid','ng','ng.guid=v.AvsURL');
$q	->leftjoin('node', 'n', 'n.nid = ng.nid');
 
//условия
$q	->condition('s.PlayerID',$player_list,'=');
$q	->condition('s.DateTimeStart',$day_first_int,'>');
$q	->condition('s.DateTimeStart',$day_end_int,'<');
$q	->condition('n.title','','<>');
 
//извлекаемые поля
$q	->fields('s',array('VideoID'));
$q	->fields('v',array('AvsURL'));
$q	->fields('n',array('title'));
 
$q	->addExpression('count(*)','views');
$q	->addExpression('count(distinct s.UserID)','uniques');
 
//группировки
$q->groupBy('s.VideoID');
$q->groupBy('v.AvsURL');
$q->groupBy('n.title');
 
//сортировки
$q	->orderBy('views','desc');
$q	->orderBy('uniques','desc');
 
//выполнение запроса
$result=$q->limit(20)->execute();
 
$rows=array();
 
while($record=$result->fetchAssoc()){
	$rows[]=array(
		array('data'=>'<a href="my_url/video_id/'.$record['VideoID'].'" >'.$record['title'].'</a>'),
		array('data'=>$record['views']),
		array('data'=>$record['uniques']),
		array('data'=>'<a rel="lightframe" href="clickberry_statistic_flash/'.$record['VideoID'].'" >View graph</a>'),
	);
}

$q=db_update('cb_services_dir');
$q->fields(array('name' => $dirname,'par_id'=>$dir_parentid));
$q->condition('id', $dir_id);
$q->execute();

$q=db_delete('cb_services_comments_child');
$q->condition('srv_id', $comm_id);
//обратите внимание на оператор in.В переменной $commn должен быть не список значений через запятую,а массив этих значений.
$q->condition('id', $commn,'in');
$q->execute();

$fields = array(
	'user_id' => $user->uid,
	'created' => $created,
	'string_id' => $string_id,
	'name' => $name,
	'directory' => $dir,
	'title' => $title,
	'options' => $options_str,
	'lang' => $service_lang
);
db_insert('cb_services_poll')->fields($fields)->execute();	

$q	=db_select('cb_stats_objects','o');
$q	->condition('o.VideoID',$v_id,'=');
$q	->leftjoin('cb_stats_clicks', 'c', 'o.ID = c.ObjectID');
$q	->fields('o',array('ObjectName','ObjectURL'));
$q	->addExpression('count(*)','clicks');
$q	->groupBy('o.ID,o.ObjectName,o.ObjectURL');
$q	->orderBy('clicks','desc');
$result=$q->execute();


 Читайте также:


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

Войти используя Loginza Vkontakte Facebook livejournal Google Account Yandex Mail.ru API Rambler Last.fm Twitter WebMoney
  • Строки и параграфы переносятся автоматически.
  • Доступные HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

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

три + = двенадцать
Решите этот математический пример.Решение введите цифрой.Например для "один * четыре=?" введите "4"