Звонок в компьютерный магазин:
-Здравствуйте, я у вас компьютер покупал, так он сдох.
-А гарантия на него какая была?
-Пожизненная.
-Раз сдох - гарантия кончилась!!
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();

