2013-10-15 4 views
0

Je suis en train de développer un composant personnalisé pour Joomla 2.5. Je sais, il est beaucoup de travail, mais je suis, et tout fonctionne très bien pour le moment;)Joomla 2.5 - Requêtes de bases de données multiples via l'API

je traite avec 2 bases de données:

  • un maître, qui contient toutes les informations principales sur les produits, avec une structure classique (produits, catégories, relations produit-catégories, fabricants ...)
  • un esclave, qui contient uniquement des informations locales (product_id & certains trucs personnalisés comme les prix de vente pour ce magasin particulier).

Le processus de création de requêtes sur le maître OU la base de données locale est correct. Un facile getDbo() pour db local, et un getInstance pour maître db avec de nouveaux params dans le tableau comme

$masterdb = & JDatabase::getInstance($master_options); 

MAIS: Que faire si je veux faire un « croisé requête » entre les deux dbs avec REJOINT ? comme:

SELECT * 
FROM slave_db.mytable 
LEFT JOIN master_db.othertable 
ON slave_db.mytable.column_name=master_db.othertable.column_name; 

Est-ce que le framework de Joomla le permet? Si ce n'est pas le cas, je pense que je pourrais soit écrire une requête codée en dur, hors de la manière de joomla de le faire ... mais je n'aime pas vraiment l'idée ... ou je pourrais faire une demande séparée et travailler seulement en PHP pour comparer/fusionner/réorganiser des tableaux ... mais ça craint aussi!

Aidez s'il vous plaît! ;)

+0

J'ai peur Joomla! n'a pas de solution de base pour cela. Vous devez étendre DBO ou écrire vos propres requêtes externes avec PHP. – di3sel

Répondre

1

OK, voici comment j'ai réussi à le faire! C'est un peu sournois, mais ça marche ...

// For Master DB calls. 
$master_options['driver'] = MASTER_DRIVER; 
$master_options['host']  = MASTER_HOST; 
$master_options['user']  = MASTER_USER; 
$master_options['password'] = MASTER_PASSWORD; 
$master_options['database'] = MASTER_DB; 
$master_options['prefix'] = MASTER_PREFIX; 
$masterdb = JDatabase::getInstance($master_options); 

$query = $masterdb->getQuery(true); 

//slave infos 
$app   = JFactory::getApplication(); 
$slave_prefix = $app->getCfg('dbprefix'); 
$slave_name  = $app->getCfg('db'); 

$query = "SELECT * 
FROM `".$slave_name."`.`".$slave_prefix."mytable` 
LEFT JOIN `".$master_options['database']."`.`".$master_options['prefix']."othertable` 
ON `".$slave_name."`.`".$slave_prefix."mytable`.`column_name`=`".$master_options['database']."`.`".$master_options['prefix']."othertable`.`column_name`"; 

$masterdb->setQuery((string)$query);