Почитать другие заметки или статьи

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