Перед прочтением этого материала рекомендуем вам ознакомиться со следующими материалами:
Содержание
Вступление
Работу с базой данных условно можно разделить на две группы:
- выборка данных и получение результата
- вставка, обновление и удаление данных
В этом материале мы разберем, как с помощью методов группы классов 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();