Print this page

Способы обращения к базе данных в Joomla 3 и 4

Rate this item
(9 votes)

Введение

Для того чтобы связаться с базой данных в 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();