Работа с базой данных в Joomla

JDatabase – вставка, обновление и удаление данных

Joomla
JDatabase – вставка, обновление и удаление данных

Перед прочтением этого материала рекомендуем вам ознакомиться со следующими материалами:

Содержание

Вступление

Работу с базой данных условно можно разделить на две группы:

  • выборка данных и получение результата
  • вставка, обновление и удаление данных

В этом материале мы разберем, как с помощью методов группы классов JDatabase можно вставлять, обновлять и удалять данные.

Выборка данных и получение результата рассматривается в этом материале.

Вставка данных

Используя SQL

Класс JDatabaseQuery предоставляет несколько методов для вставки данных: insert(), columns() и values().

// Получаем объект коннектора базы данных
$db = JFactory::getDbo();
 
// Получаем объект запроса
$query = $db->getQuery(true);
 
// Колонки для вставки
$columns = array(
    'user_id', 
    'profile_key', 
    'profile_value', 
    'ordering'
);
 
// Значения для вставки
$values = array(
    42, 
    $db->quote('custom.message'), 
    $db->quote('Вставка данных с помощью insert()'), 
    1
);
 
// Составляем запрос
$query->insert($db->quoteName('#__user_profiles'))
    ->columns($db->quoteName($columns))
    ->values(implode(',', $values));
 
// Устанавливаем и выполняем запрос
$db->setQuery($query)
    ->execute();

Используя объект

Класс JDatabaseDriver предоставляет удобный метод insertObject($table, &$object, $key = null) для сохранения объекта напрямую в базу данных:

  • $table – имя таблицы
  • &$object – объект, публичные свойства которого соответствуют полям в таблице
  • $key – первичный ключ

В случае если мы передаем третий параметр, то свойству $key объекта присваивается значение идентификатора последней вставленной записи.

// Создаем и заполняем объект
$profile = new stdClass();
$profile->user_id = 42;
$profile->profile_key = 'custom.message';
$profile->profile_value= 'Вставка данных с помощью insertObject()';
$profile->ordering = 1;
 
// Вставляем объект в таблицу профиля пользователя
$result = JFactory::getDbo()->insertObject('#__user_profiles', $profile);

Метод insertObject() автоматически экранирует данные: применяет quoteName() к имени таблицы и колонкам, а также quote() к значениям.

Метод возвращает true, если вставка прошла успешно, в противном случае false.

Обновление данных

Используя SQL

Класс JDatabaseQuery предоставляет два метода для обновления данных: update() и set().

// Получаем объект коннектора базы данных
$db = JFactory::getDbo();
 
// Получаем объект запроса
$query = $db->getQuery(true);
 
// Поля для обновления
$fields = array(
    $db->quoteName('profile_value') . ' = ' . $db->quote('Обновление данных для пользователя 42.'),
    $db->quoteName('ordering') . ' = 2'
);
 
// Условия обновления
$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)
    ->execute();

Используя объект

По аналогии с методом insertObject() класс JDatabaseDriver предоставляет метод updateObject($table, &$object, $key, $nulls = false) для обновления данных:

  • $table – имя таблицы
  • &$object – объект, публичные свойства которого соответствуют полям в таблице
  • $key – первичный ключ
  • $nulls – передаем true, если хотим обновить NULL значения

Ниже мы обновляем нашу таблицу, используя существующий первичный ключ id:

// Создаем и заполняем объект
$object = new stdClass();
$object->id = 1; // должен быть валидный первичный ключ
$object->title = 'Моя запись';
$object->description = 'Запись, которая будет обновлена.';
 
// Обновляем данные, используя id в качестве первичного ключа
$result = JFactory::getDbo()->updateObject('#__custom_table', $object, 'id');

Так же как и insertObject(), метод updateObject() автоматически экранирует данные: применяет quoteName() к имени таблицы и колонкам, а также quote() к значениям.

Метод возвращает true, если обновление прошло успешно или не было найдено полей для обновления, в противном случае RuntimeException.

Удаление данных

Удаление записи выполняется с помощью метода delete() класса JDatabaseQuery.

// Получаем объект коннектора базы данных
$db = JFactory::getDbo();
 
// Получаем объект запроса
$query = $db->getQuery(true);
 
// Удаляем все custom-ключи пользователя 42
$conditions = array(
    $db->quoteName('user_id') . ' = 42', 
    $db->quoteName('profile_key') . ' = ' . $db->quote('custom.%')
);
 
$query->delete($db->quoteName('#__user_profiles'))
    ->where($conditions);
 
// Устанавливаем и выполняем запрос
$db->setQuery($query)
    ->execute();

Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)