На официальной странице документации 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(`имя вашей таблицы`);