Введение
Для того чтобы связаться с базой данных в Joomla, нужно получить новый экземпляр класса JDatabaseQuery
, мы используем метод getQuery
JDatabaseDriver
.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
Или короткой записью в модели
$query = $this->getDbo()->getQuery( true )
Начиная с Joomla 3.9
// Добавьте в начале файла
use Joomla\CMS\Factory;
// Далее можно использовать
$db = Factory::getDbo();
Только для Joomla 4 и выше.
// Добавьте в начале файла
use Joomla\CMS\Factory;
// Далее можно использовать
$db = Factory::getContainer()->get('DatabaseDriver');
Выборка из базы данных
Выбор определенной записи.
$id = '122';
$query = $this->getDbo()->getQuery( true )
->select( '*' )
->from( '#__products' )
->where( 'id="' . $id . '"')
->where( 'published="1"');
$product = $this->getDbo()->setQuery( $query )->loadObject();
Выборка записей определенных в массиве.
$IDs = array('1', '2', '3', '4');
$query = $this->getDbo()->getQuery( true )
->select( '*' )
->from( '#__products' )
->where( 'id IN (' . implode(',', $IDs) . ')' )
->where( 'published="1"' );
$products = $this->getDbo()->setQuery( $query )->loadObjectList();
Вставка в базу данных
$db = JFactory::getDbo();
$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('#__profiles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
$db->setQuery($query)->execute();
Обновление записи в базе данных
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$fields = array(
$db->quoteName('profile_value') . ' = ' . $db->quote('Updating custom message for user 1001.'),
$db->quoteName('ordering') . ' = 2'
);
$conditions = array(
$db->quoteName('user_id') . ' = 42',
$db->quoteName('profile_key') . ' = ' . $db->quote('custom.message')
);
$query->update($db->quoteName('#__profiles'))->set($fields)->where($conditions);
$db->setQuery($query)->execute();
Удаление из базы данных
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$conditions = array(
$db->quoteName('user_id') . ' = 888',
$db->quoteName('profile_key') . ' = ' . $db->quote('custom.%')
);
$query->delete($db->quoteName('#__profiles'));
$query->where($conditions);
$db->setQuery($query)->execute();
Подсчет общего количества записей в таблице
Данный способ не возвращает объект или массив записей для дальнейшего подсчета, а только одну цифру с количеством строк. Это позволяет с минимальной нагрузкой получить желаемый результат.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__content'));
// С использованием условия или без
$query->where($db->quoteName('category')." = ".$db->quote('22'));
$db->setQuery($query);
$result = $db->loadResult();
Показать имена всех таблиц в БД. SHOW TABLES в Joomla
Таке будут выведены имена таблиц первой Базы Данных
$db = JFactory::getDbo();
$results = $db->setQuery('SHOW TABLES')->loadColumn();
Вывод название таблиц из требуемой БД
$db = JFactory::getDbo();
$results = $db->setQuery('SHOW TABLES FROM my_db_name')->loadColumn();
Подключение к другой базе данных средствами Joomla
Такой способ позволяет подключится не только к другой базе данных на вашем сервере но к БД находящихся на других серверах.
$option = array();
$option['driver'] = 'mysqli'; // Имя драйвера БД
$option['host'] = 'localhost'; // Хост БД
$option['user'] = '2345345'; // Имя пользователя
$option['password'] = '35345345'; // Пароль
$option['database'] = 'my_db'; // Имя БД
$option['prefix'] = '4h4j_'; // префикс (может быть пустым)
$db = JDatabaseDriver::getInstance( $option );
$query = $db->getQuery(true);
$query->select( '*' )
->from( '#__content' )
->where( 'published = 1' );
$db->setQuery($query);
$items = $db->loadObjectList();
Создание новых таблиц. CREATE TABLE в Joomla.
$db = JFactory::getDbo();
try {
$query = $db->getQuery(true);
$query = "CREATE TABLE IF NOT EXISTS -- my_table` (
`id` int(16) NOT NULL primary key AUTO_INCREMENT,
`userid` int(16) NOT NULL,
`message` text NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
";
$db->setQuery($query);
$db->query();
} catch (Exception $e){
echo $e->getMessage();
}
Выборка включая дочерние категории.
Выборка материалов включая материалы из дочерних категорий на примере com_content.
$parentCategory = '22';
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('a.id, a.title')
->select('c.title as category_title')
->from('#__content AS a')
->where('a.state = "1"');
$query->leftJoin( '#__categories as c ON c.id=a.catid' );
// Including child categories
$tableCategory = JTable::getInstance('category');
$tableCategory->load( $parentCategory );
$rgt = $tableCategory->rgt;
$lft = $tableCategory->lft;
$query->where('c.lft >= ' . (int) $lft);
$query->where('c.rgt <= ' . (int) $rgt);
$db->setQuery($query);
$result = $db->loadObjectList();
Случайная выборка из Базы Данных 'RAND()'.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__content');
// Ordering
$query->order('RAND()');
$db->setQuery($query);
$result = $db->loadObjectList();
Лимит выбора записей.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__content');
// Limit
$query->setLimit('10');
$db->setQuery($query);
$result = $db->loadObjectList();