На официальной странице документации Joomla существуют странички посвященные работе с встроенным конструктором запросов в базу данных. Было очень удобно пользоваться представленной информацией. Однако, в уже в Joomla 4 метод $db = JFactory::getDbo(), объявлен, как устаревший (deprecated). Поэтому я написал небольшую шпаргалку по работе с конструктором. Надеюсь, она будет полезна и тем, кто волею судеб оказался на моем сайте.
SELECT ЗАПРОСЫ
Получить значение из таблицы
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db
->getQuery(true)
->select('field_name')
->from($db->quoteName('#__my_table'))
->where($db->quoteName('some_name') . " = " . $db->quote($some_value));
$db->setQuery($query);
$result = $db->loadResult();
Получить массив объектов из нескольких таблиц
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
$query
->select(array('a.*', 'b.username', 'b.name'))
->from($db->quoteName('#__content', 'a'))
->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
->order($db->quoteName('a.created') . ' DESC');
$db->setQuery($query);
$results = $db->loadObjectList();
Более подробно про варианты получения данных написано на странице официальной документации.
Добавление записи в таблицу (INSERT)
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
$columns = array('user_id', 'profile_key', 'profile_value', 'ordering');
$values = array(1001, $db->quote('custom.message'), $db->quote('Inserting a record using insert()'), 1);
$query
->insert($db->quoteName('#__user_profiles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
$db->setQuery($query);
$db->execute();
Где $columns - названия столбцов (колонок), а $values -вставляемые значения.
Есть и более удобный, с моей точки зрения, способ.
Добавление записи в базу данных из объекта.
use Joomla\CMS\Factory;
// Создаем объект с данными
$object = new stdClass();
$object->user_id = 1001;
$object->profile_key='custom.message';
$object->profile_value='Inserting a record using insertObject()';
$object->ordering=1;
$db = Factory::getContainer()->get('DatabaseDriver');
//Добавляем запись в базу данных
$result = $db->insertObject('#__user_profiles', $object);
// Получаем id созданной записи
$new_row_id = $db->insertid();
Обновление данных в таблице - UPDATE
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
// Поля, которые будем обновлять
$fields = array(
$db->quoteName('profile_value') . ' = ' . $db->quote('Updating custom message for user 1001.'),
$db->quoteName('ordering') . ' = 2',
// If you would like to store NULL value, you should specify that.
$db->quoteName('avatar') . ' = NULL',
);
// Задаем условия.
// Обновляем только те строки
// где user_id равен 42, а значение поля profile_key равно значению "custom.message"
$conditions = array(
$db->quoteName('user_id') . ' = 42',
$db->quoteName('profile_key') . ' = ' . $db->quote('custom.message')
);
$query->update($db->quoteName('#__user_profiles'))->set($fields)->where($conditions);
$db->setQuery($query);
$result = $db->execute();
Описанный выше способ хорош, когда нужно обновить несколько строк. Однако, при обновлении одной строки удобнее воспользоваться все тем же объектом
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$updateNulls = true;
$object = new stdClass();
$object->id = 1;
$object->title = 'My Custom Record';
$object->description = 'A custom record being updated in the database.';
$object->short_description = null;
$result = $db->updateObject('#__custom_table', $object, 'id', $updateNulls);
В примере выше мы обновили запись, у которой id равен 1.
Удаление из базы данных
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
// Удаляем все строки, где user_id равен 1001 и profile_key равен значению "test"
$conditions = array(
$db->quoteName('user_id') . ' = 1001',
$db->quoteName('profile_key') . ' = ' . $db->quote('test')
);
$query->delete($db->quoteName('#__user_profiles'));
$query->where($conditions);
$db->setQuery($query);
$result = $db->execute();
Очистка данных из указанной таблицы
Если есть необходимость полностью очистить указанную таблицу, следует воспользоваться приведенным ниже кодом:
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$db->truncateTable(`имя вашей таблицы`);
Заключение
Напоминаю!
Если у вас остались вопросы и предложения, их всегда можно озвучить в группе VK по ссылке ниже:
А также в недавно созданной группе Telegram. Ссылка:
Войти через Яндекс
