ЗАГРУЗКА
Универсальный драйвер Кристалл для работы с базой данных:
Драйвер основан на цепочке запросов и относится к методу, соединяющему несколько методов, один за другим, каждый метод возвращает объект, который может поддерживать следующий метод, улучшая читабельность и упрощая код.
Чтобы получить новый экземпляр класса DatabaseQuery
, необходимо использовать метод getQuery
DatabaseDriver
:
$db = Factory::getDbo();
$query = $db->getQuery(true);
Чтобы запросить источник данных, мы можем вызвать несколько методов DatabaseQuery
; эти методы инкапсулируют язык запросов источника данных (в большинстве случаев SQL), скрывая специфический синтаксис запроса от разработчика и увеличивая переносимость исходного кода.
Некоторые из наиболее часто используемых методов включают в себя: select
, from
, join
, where
, setLimit
и order
. Существуют также такие методы, как вставка insert
, обновление update
и удаление delete
для изменения записей в хранилище данных. Объединяя эти и другие вызовы методов, мы можем создать практически любой запрос к нашему хранилищу данных без ущерба для переносимости кода.
Ниже приведен пример создания запроса к базе данных с использованием класса DatabaseQuery
. Используя методы select
, from
, where
,bind
и order
, можно создавать гибкие, легко читаемые и переносимые запросы:
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
// Выберем все записи из таблицы clients, где ключ org_id = 1.
// Сортируем вывод по полю ordering.
$query->select($db->quoteName(array('id', 'profile_key', 'profile_value', 'ordering')));
$query->from($db->quoteName('#__clients'));
$query->where($db->quoteName('org_id') . ' = 1');
$query->order('ordering ASC'); // ASC - по возрастанию; DESC - по убыванию
// Используйте $query->order('RAND()'); для случайной выборки.
// Применим запрос, используя наш недавно заполненный объект запроса.
$db->setQuery($query);
// Загрузим результаты в виде списка объектов stdClass
// (дополнительные параметры для получения данных см. ниже).
$results = $db->loadObjectList();
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('id', 'profile_key', 'profile_value', 'ordering')))
->from($db->quoteName('#__clients'))
->where($db->quoteName('org_id') . ' = 1')
->order('ordering ASC'); // ASC - по возрастанию; DESC - по убыванию
// Используйте $query->order('RAND()'); для случайной выборки.
// Применим запрос, используя наш недавно заполненный объект запроса.
$db->setQuery($query);
// Загрузим результаты в виде списка объектов stdClass
// (дополнительные параметры для получения данных см. ниже).
$results = $db->loadObjectList();
<?php
use Kristall\Database\ParameterType;
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
$orgid = 1;
$query
->select($db->quoteName(array('id', 'profile_key', 'profile_value', 'ordering')))
->from($db->quoteName('#__clients'))
->where($db->quoteName('org_id') . ' = :orgid')
// Константы ParameterType: BOOLEAN, INTEGER, LARGE_OBJECT, NULL, STRING (по умолчанию)
->bind(':orgid', $orgid, ParameterType::INTEGER)
->order('ordering ASC'); // ASC - по возрастанию; DESC - по убыванию
// Используйте $query->order('RAND()'); для случайной выборки.
// Применим запрос, используя наш недавно заполненный объект запроса.
$db->setQuery($query);
// Загрузим результаты в виде списка объектов stdClass
// (дополнительные параметры для получения данных см. ниже).
$results = $db->loadObjectList();
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
$query->format('SELECT %1$n, %2$n, %3$n, %4$n FROM %5$n WHERE %6$n = %7$a ORDER BY %8$n',
'id', 'profile_key', 'profile_value', 'ordering',
'#__clients',
'org_id',
1,
'ordering ASC');
// Применим запрос, используя наш недавно заполненный объект запроса.
$db->setQuery($query);
// Загрузим результаты в виде списка объектов stdClass
// (дополнительные параметры для получения данных см. ниже).
$results = $db->loadObjectList();
Каждый токен принимает одну из следующих форм:
Спецификатор типов:
Спецификатор типов даты:
/* Добавление одного условия или массива условий в строку WHERE запроса */
$query->where('a = 1')->where('b = 2');
$query->where(array('a = 1', 'b = 2'));
/* Добавление в запрос инструкцию WHERE IN. */
$query->whereIn('id', array(1, 2, 3));
/* Добавление в запрос оператор WHERE NOT IN. */
$query->whereNotIn('id', array(1, 2, 3));
/** Расширение строки WHERE одним условием или массивом условий с потенциально
* другим логическим оператором, отличным от того, который используется
* в текущем предложении WHERE. */
$query->where(array('a = 1', 'b = 2'))->extendWhere('XOR', array('c = 3', 'd = 4'));
// Сформированная строка запроса: WHERE ((a = 1 AND b = 2) XOR (c = 3 AND d = 4))
/* Расширение строки WHERE оператором OR и одним условием или массивом условий. */
$query->where(array('a = 1', 'b = 2'))->orWhere(array('c = 3', 'd = 4'));
// Сформированная строка запроса: WHERE ((a = 1 AND b = 2) OR (c = 3 AND d = 4))
/* Расширение строки WHERE оператором AND и одним условием или массивом условий. */
$query->where(array('a = 1', 'b = 2'))->andWhere(array('c = 3', 'd = 4'));
// Сформированная строка запроса: WHERE ((a = 1 AND b = 2) AND (c = 3 OR d = 4))
Используя методы DatabaseQuery
join
, можно выбирать записи из нескольких связанных таблиц. Общий метод join
принимает два аргумента: тип соединения (INNER
, OUTER
, LEFT
, RIGHT
) и условие соединения.
<?php
use Kristall\Input\Input;
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
// Получаем параметр запроса
$input = new Input(); // см. библиотеку [Супер глобальный массив]
$user_org_id = $input->getInt('user_org_id', 0);
$query
->select($db->quoteName(array('module.mod_id', 'module.mod_name')))
->select($db->quoteName('modprice.mod_price'))
->from($db->quoteName('#__modules','module'))
// Условие объединения таблиц modules и modules_price
->join('LEFT', $db->quoteName('#__modules_price', 'modprice') .
' ON ' . $db->quoteName('module.mod_id') . ' = ' . $db->quoteName('modprice.mod_id'))
// Условия выборки из таблицы modules
->where(array(
$db->quoteName('module.disabled') . ' = 0',
$db->quoteName('module.mod_for_all') .' >= 0'))
->andWhere(array(
$db->quoteName('module.mod_org'). ' = ' . $user_org_id,
$db->quoteName('module.mod_org') . ' IS NULL'))
// Условия выборки из таблицы modules_price
->where(array(
$db->quoteName('modprice.mod_type') . ' = 1',
$db->quoteName('modprice.mod_from') . ' <= ' . time()))
->andWhere(array(
$db->quoteName('modprice.mod_to') . ' > ' . time(),
$db->quoteName('modprice.mod_to') . ' IS NULL'));
$db->setQuery($query);
// Выведем построенный запрос на экран
echo $db->getQuery();
Результат выполнения скрипта:
SELECT "module"."mod_id","module"."mod_name","modprice"."mod_price"
FROM "#__modules" AS "module"
LEFT JOIN "#__modules_price" AS "modprice" ON "module"."mod_id" = "modprice"."mod_id"
WHERE
(
("module"."disabled" = 0 AND "module"."mod_for_all" >= 0)
AND ("module"."mod_org" = 1 OR "module"."mod_org" IS NULL)
AND "modprice"."mod_type" = 1 AND "modprice"."mod_from" <= 1651540243
)
AND ("modprice"."mod_to" > 1651540243 OR "modprice"."mod_to" IS NULL)"
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
// Поля для обновления.
$fields = array(
$db->quoteName('profile_value') . ' = ' . $db->quote('Демо данные.'),
$db->quoteName('ordering') . ' = 2',
// Если вы хотите сохранить значение NULL, вы должны указать это.
$db->quoteName('avatar') . ' = NULL',
);
// Условия, для которых записи должны быть обновлены.
$conditions = array(
$db->quoteName('id') . ' = 42',
$db->quoteName('profile_key') . ' = ' . $db->quote('custom.message')
);
$query->update($db->quoteName('#__clients'))->set($fields)->where($conditions);
$db->setQuery($query)->execute();
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
// Столбцы для вставки.
$columns = array('profile_key', 'profile_value', 'ordering');
// Вставляемые значения.
$values = array($db->quote('custom.message'), $db->quote('Демо данные'), 137);
// Подготовка запроса на вставку.
$query
->insert($db->quoteName('#__clients'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
// Установим запрос, используя наш недавно заполненный объект запроса, и выполним его.
$db->setQuery($query)->execute();
// Получить id только что вставленной строки [auto_increment]
$new_row_id = $db->insertid();
// Получить соединение с БД.
$db = Factory::getDbo();
// Создаём новый объект запроса.
$query = $db->getQuery(true);
// Удалить все пользовательские ключи для группы 12.
$conditions = array(
$db->quoteName('group_id') . ' = 12',
$db->quoteName('profile_key') . ' = ' . $db->quote('custom.%')
);
$query->delete($db->quoteName('#__clients'))->where($conditions);
// Установим запрос, используя наш недавно заполненный объект запроса, и выполним его.
$db->setQuery($query)->execute();
Компания НПО «Кристалл» - российская многопрофильная ИТ-компания, уже более 12 предоставляет профессиональные услуги и высокотехнологичные решения в области IT-консалтинга, интеграционных проектов и разработки программного обеспечения для корпоративных заказчиков.
ПОДРОБНЕЕ8 800 300 2628,
+7 (4217) 591-830
+7 (962) 297-36-06
info@mbskristall.ru, poisk_kms@mail.ru
681016, Россия, Хабаровский край, г. Комсомольск-на-Амуре, ул. Кирова, 5, п. 1001