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

JDatabaseDriver – выборка данных и получение результата

Joomla
JDatabaseDriver – выборка данных и получение результата

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

Содержание

Вступление

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

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

В этом материале мы разберем, как можно эффективно выбирать данные и получать результат, используя обширный набор методов класса 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 позволяет задать имя класса объекта. Будут созданы экземпляры указанного класса и заполнены полученными свойствами.

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