Перед прочтением этого материала рекомендуем вам ознакомиться со следующими материалами:
Содержание
- Вступление
- Выборка данных из одной таблицы
- Выборка данных из нескольких таблиц
- Выборка данных с подзапросом
- Получение результата
Вступление
Работу с базой данных условно можно разделить на две группы:
- выборка данных и получение результата
- вставка, обновление и удаление данных
В этом материале мы разберем, как можно эффективно выбирать данные и получать результат, используя обширный набор методов класса JDatabaseDriver.
Вставка, обновление и удаление данных рассматривается в этом материале.
Перед тем, как начать работу с базой данных, нам необходимо получить экземпляр класса JDatabaseDriver (объект коннектора базы данных) и экземпляр класса JDatabaseQuery (объект запросов):
// Получаем объект коннектора базы данных
$db = JFactory::getDbo();
// Получам объект запросов
$query = $db->getQuery(true);
Выборка данных из одной таблицы
Вот как выглядит выборка данных из одной таблицы:
// Составляем запрос
$query
->select(
$db->quoteName(
array('username', 'name', 'email')
)
)
->from($db->quoteName('#__users'))
->where($db->quoteName('id') . ' > 1')
->order('id DESC');
// Устанавливаем запрос
$db->setQuery($query);
// Получаем результат в виде списка stdClass объектов
$result = $db->loadObjectList();
Выборка данных из нескольких таблиц
Для выборки данных из нескольких таблиц традиционно используется присоединение:
// Выбираем значения из #__content
$query->select('a.*');
$query->from($db->quoteName('#__content', 'a'));
$query->where($db->quoteName('a.state') . ' = 1');
$query->where($db->quoteName('a.created_by') . ' = 42');
// Присоединяем #__users
$query->select($db->quoteName('b.username'));
$query->leftJoin(
$db->quoteName('#__users', 'b')
. ' ON '
. $db->quoteName('b.id')
. ' = '
. $db->quoteName('a.created_by')
);
// Сортируем по title
$query->order($db->quoteName('a.title') . ' ASC');
// Устанавливаем запрос
$db->setQuery($query);
// Получаем результат в виде списка stdClass объектов
$result = $db->loadObjectList();
Выборка данных с подзапросом
Выборка данных с подзапросом осуществляется при помощи двух объектов запроса, один из которых используется внутри метода второго объекта:
$subQuery = $db->getQuery(true);
$query = $db->getQuery(true);
// Составляем подзапрос
$subQuery->select('*')
->from($db->quoteName('#__sub_table'))
->where($db->quoteName('subTest') . ' = 1');
// Составляем основной запрос
$query->select('*')
->from($db->quoteName('#__table'))
->where($db->quoteName('state') . ' = 1')
->where($db->quoteName('subCheckIn') . ' IN (' . $subQuery . ')')
->order($db->quoteName('ordering') . ' ASC');
// Устанавливаем запрос
$db->setQuery($query);
Полученный SQL-запрос:
SELECT * FROM `#__table` WHERE `state` = 1 AND `subCheckIn` IN ( SELECT * FROM `#__sub_table` WHERE `subTest` = 1) ORDER BY `ordering` ASC
Обратите внимание, что объект $subQuery
автоматически был преобразован в строку благодаря методу __toString() класса JDatabaseQuery.
Получение результата
Передоложим, что у нас в таблице #__users
есть три записи:
id, name, username, email, ... 837, 'Ольга', 'joomla', 'joomla[]test.ru', ... 838, 'Василий', 'demo', 'demo[]test.ru', ... 839, 'Дмитрий', 'dima', 'dima[]test.ru', ...
Для получения результата мы можем использовать большое количество различных методов. Их использование зависит от того, какой запрос мы устанавливаем, и какой результат мы хотим получить.
Результат с единичным значением
loadResult()
Метод loadResult()
используется для получения единичного значения, например значение единичного поля из единичной строки таблицы (или из первой найденной строки).
$query->select($db->quoteName('username'))
->from($db->quoteName('#__users'))
->where($db->quoteName('id') . ' = 839');
$db->setQuery($query);
$result = $db->loadResult();
Результат:
dima
Результат с единичной строкой
Каждый из этих методов возвращает единичную строку из базы данных, даже если под критерии выборки попадает несколько строк. Для получения несколько строк, обратитесь к разделу "Результат с несколькими строками".
loadRow()
Метод loadRow()
возвращает индексированный массив единичной строки таблицы. Индексы массива пронумерованы и начинаются с нуля.
$query
->select(
$db->quoteName(
array('username', 'name', 'email')
)
)
->from($db->quoteName('#__users'))
->where($db->quoteName('id') . ' = 839');
$db->setQuery($query);
$result = $db->loadRow();
Результат:
Array
(
[0] => dima
[1] => Дмитрий
[2] => dima[]test.ru
)
loadAssoc()
Метод loadAssoc()
возвращает ассоциированный массив единичной строки таблицы. Индексами массива являются названия полей.
...
$db->setQuery($query);
$result = $db->loadAssoc();
Результат:
Array
(
[username] => dima
[name] => Дмитрий
[email] => dima[]test.ru
)
loadObject($class = 'stdClass')
Метод loadObject()
возвращает PHP-объект единичной строки таблицы.
...
$db->setQuery($query);
$result = $db->loadObject();
Результат:
stdClass Object
(
[username] => dima
[name] => Дмитрий
[email] => dima[]test.ru
)
Параметр $class
позволяет задать имя класса объекта. Будет создан экземпляр указанного класса и заполнен полученными свойствами.
Результат с единичной колонкой
Каждый из этих методов возвращает единичную колонку из базы данных.
loadColumn($offset = 0)
Метод loadColumn()
возвращает индексированный массив единичной колонки таблицы. Индексы массива пронумерованы и начинаются с нуля.
$query->select($db->quoteName('username'))
->from($db->quoteName('#__users'));
$db->setQuery($query);
$result = $db->loadColumn();
Результат:
Array
(
[0] => joomla
[1] => demo
[2] => dima
)
Если в выборке участвует несколько колонок, то при помощи параметра $offset
можно задать, какая именно колонка попадет в результат.
$query
->select(
$db->quoteName(
array('username', 'name', 'email')
)
)
->from($db->quoteName('#__users'));
$db->setQuery($query);
$result = $db->loadColumn(2);
Результат:
Array
(
[0] => joomla[]test.ru
[1] => demo[]test.ru
[2] => dima[]test.ru
)
Таким образом, в результат выборки попала третья колонка email
.
Мы также можем производить итерацию по колонкам:
for ($i = 0; $i <= 2; $i++)
{
$column = $db->loadColumn($i);
print_r($column);
}
Результат:
Array
(
[0] => joomla
[1] => demo
[2] => dima
)
Array
(
[0] => Ольга
[1] => Василий
[2] => Дмитрий
)
Array
(
[0] => joomla[]test.ru
[1] => demo[]test.ru
[2] => dima[]test.ru
)
Результат с несколькими строками
Каждый из этих методов возвращает несколько строк из базы данных.
loadRowList($key = null)
Метод loadRowList()
возвращает индексированный массив индексированных массивов из нескольких строк таблицы.
...
$db->setQuery($query);
$result = $db->loadRowList();
Результат:
Array
(
[0] => Array
(
[0] => joomla
[1] => Ольга
[2] => joomla[]test.ru
)
[1] => Array
(
[0] => demo
[1] => Василий
[2] => demo[]test.ru
)
[2] => Array
(
[0] => dima
[1] => Дмитрий
[2] => dima[]test.ru
)
)
Параметр $key
является смещением полей, которое позволяет нам задать имя ключа массивов.
...
$db->setQuery($query);
$result = $db->loadRowList(0);
Результат:
Array
(
[joomla] => Array
(
[0] => joomla
[1] => Ольга
[2] => joomla[]test.ru
)
[demo] => Array
(
[0] => demo
[1] => Василий
[2] => demo[]test.ru
)
[dima] => Array
(
[0] => dima
[1] => Дмитрий
[2] => dima[]test.ru
)
)
Мы видим, что ключом массива стало первое поле username
.
loadAssocList($key = null, $column = null)
Метод loadAssocList()
возвращает индексированный массив ассоциированных массивов из нескольких строк таблицы.
...
$db->setQuery($query);
$result = $db->loadAssocList();
Результат:
Array
(
[0] => Array
(
[username] => joomla
[name] => Ольга
[email] => joomla[]test.ru
)
[1] => Array
(
[username] => demo
[name] => Василий
[email] => demo[]test.ru
)
[2] => Array
(
[username] => dima
[name] => Дмитрий
[email] => dima[]test.ru
)
)
Параметр $key
позволяет нам задать имя ключа массивов. Ключом должно быть валидное имя колонки.
...
$db->setQuery($query);
$result = $db->loadAssocList('username');
Результат:
Array
(
[joomla] => Array
(
[username] => joomla
[name] => Ольга
[email] => joomla[]test.ru
)
[demo] => Array
(
[username] => demo
[name] => Василий
[email] => demo[]test.ru
)
[dima] => Array
(
[username] => dima
[name] => Дмитрий
[email] => dima[]test.ru
)
)
Если задан параметр $column
, то в результат попадают записи с указанным в параметре именем колонки.
...
$db->setQuery($query);
$result = $db->loadAssocList('username', 'email');
Результат:
Array
(
[joomla] => joomla[]test.ru
[demo] => demo[]test.ru
[dima] => dima[]test.ru
)
loadObjectList($key = '', $class = 'stdClass')
Метод loadObjectList()
возвращает индексированный массив PHP-объектов из нескольких строк таблицы.
...
$db->setQuery($query);
$result = $db->loadObjectList();
Результат:
Array
(
[0] => stdClass Object
(
[username] => joomla
[name] => Ольга
[email] => joomla[]test.ru
)
[1] => stdClass Object
(
[username] => demo
[name] => Василий
[email] => demo[]test.ru
)
[2] => stdClass Object
(
[username] => dima
[name] => Дмитрий
[email] => dima[]test.ru
)
)
Параметр $key
позволяет нам задать имя ключа массивов. Ключом должно быть валидное имя колонки.
...
$db->setQuery($query);
$result = $db->loadObjectList('username');
Результат:
Array
(
[joomla] => stdClass Object
(
[username] => joomla
[name] => Ольга
[email] => joomla[]test.ru
)
[demo] => stdClass Object
(
[username] => demo
[name] => Василий
[email] => demo[]test.ru
)
[dima] => stdClass Object
(
[username] => dima
[name] => Дмитрий
[email] => dima[]test.ru
)
)
Параметр $class
позволяет задать имя класса объекта. Будут созданы экземпляры указанного класса и заполнены полученными свойствами.