Utilizzare la classe JDatabaseQuery in Joomla 1.6
La struttura del database di Joomla è rimasto pressochè invariato dalla verisone Joomla 1.0 lanciata nel 2005.
Dopo sei anni, era abbastanza prevedibile un refactoring, per risolvere diversi problemi esistenti e per preparare il terreno per i prossimi cinque o sei anni di sviluppo.
Nell’ultima vesrsione Joomla 1.6 ci sono dei cambiamentei nell schema del database e nelle strutture dati che gestiscono lo stesso Db.
In questo e in successivi articoli vedidremo alcune di queste novità e come utilizzarle dal punto di vista dello sviluppo.
Oggi parliamo di JDatabaseQuery.
E’ una nuova classe nata per rispondere alle richieste di un supporto migliore ai motori di database esistenti, e per una maggiore scalabilità del sistema.
Joomla 1.6 introduce appunto una nuova classe utilizzata per la generazione di query che gli sviluppatori possono facoltativamente sfruttare.
Questa classe consente di astrarsi dal database usato.
Si noti inoltre che in PHP è possibile utilizzare il concatenamento e creare query anche molto complesse programmando in un modo molto ordinato e pulito.
Vediamo degli esempi pratici.
Nella versione precedente di Joomla per creare una query si usava
$db = JFactory::getDbo();
$db->setQuery(
'SELECT *'.
' FROM #__articles'.
' WHERE state = '.(int) $published.
' AND catid = '.(int) $categoryId.
' ORDER BY created DESC'
);
che crea una query che legge tutti gli articoli della categoria selezionata con lo stato selezionato ordinati in base alla data di creazione descrescente.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
->from('#__articles')
->where('state = '.(int) $published)
->where('catid = '.(int) $categoryId)
->order('created DESC');
$db->setQuery($query);
Vediamo ora un esempio più complesso.
Preso direttamente dalla documentazione online di joomla 1.6
Consideriamo un caso in cui ci sono tre tabelle denominate “__pt_property”, “__pt_building” e “__pt_unit”.
Le chiavi primarie per queste tabelle sono “property_id”, “building_id” e “unit_id”, rispettivamente.
Vogliamo costruire una query che restituisce il numero di unità associate a un property_id.
La tabella __pt_unit non ha relazione diretta con la tabella di __pt_property.
Essa ha una relazione con la tabella __pt_building, che a sua volta ha una relazione con la tabella di proprietà.
$db =& JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('count(*)');
$query->from('#__pt_building AS b');
$query->leftJoin('#__pt_unit AS u ON b.building_id = u.building_id');
$query->where('b.property_id = '. (int) $property_id);
$db->setQuery($query);
Ecco gli altri metodi della classe
select ($columns)
delete ($table=null)
insert ($tables)
update ($tables)
from ($tables)
join ($type, $conditions)
innerJoin ($conditions)
outerJoin ($conditions)
leftJoin ($conditions)
rightJoin ($conditions)
set ($conditions, $glue=',')
where ($conditions, $glue='AND')
group ($columns)
having ($conditions, $glue='AND')
order ($columns)
clear ($clause=null)
__toString ()
Ognuno di questi metodi serve per comporre la query.
Si possono richiamare anche in modo non ordinato e alla fine l’oggetto query avrà sempre la medesima stringa sql.