В седьмом друпале для работы с базой данных можно использовать специальное 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
Выполнение запроса
Вот в основном это всё.Теперь как это всё работает.
//устанавливаем связь с таблицей 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
//например извлечь первые 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->range(0, 20)->execute();
while($record=$result->fetchAssoc()){
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();
'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();