Per datasource relazionale si intende la famiglia dei ds progettata per interfacciarsi a strutture dati di tipo relazionale, principalmente database relazionali. L'esigenze che si possono avere nell'effettuare delle richieste verso un database sono divese, per tale motivo il tag ds contiene più attributi dedicati alla loro gestione. Alcuni esempi:
Per effettuare una connessione ad una tabella di un database.

<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="nometabella" dskey="chiavetabella" />

Se volessimo specificare i campi da restituire(selecteditems), un filtro per le righe(dswhere), un ordinamento(dsorder) e limitare le righe restituite(dslimit) basta fare:

<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="nometabella" dskey="chiavetabella" selecteditems="campo1,campo2" dswhere="campo1=5" dsorder="campo2" dslimit="50" />

Se volessimo effettuare un join tra tabelle:

SELECT * FROM tabella1,tabella2,tabella3 WHERE (tabella1.key=tabella2.tab1key) AND (tabella1.key=tabella3.tab1key)


SI IMPLEMENTA

<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="tabella1,tabella2,tabella3" dskey="key" dswhere="(tabella1.key=tabella2.tab1key) AND (tabella1.key=tabella3.tab1key)" />

Se volessimo effettuare una query:

<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dsquery_select="SELECT campo1, campo2 FROM tabella1" dskey="key" />


CASI PARTICOLARI DI JOIN:

Quando i dati da mettere insieme tramite JOIN provengono da database diversi quindi diverse sono le connessioni da utilizzare la storia di complice un pò, nel senso che questo legame non può essere espresso tramite il solo XML ma è necessario scrivere qualche riga di codice PHP, rifacendoci all'esempio sopra di suppone che tabella1, tabella2 e tabella3 si trovino in database differenti, la soluzione da adottare sarebbe questa:


<ds1 typeobj="ds" conn="connA" .... dskey="key" dstable="tabella1" />
<ds2 typeobj="ds" conn="connB" .... dskey="key" dstable="tabella2" loadall="false" />
<ds3 typeobj="ds" conn="connC" .... dskey="key" dstable="tabella3" loadall="false" />

poi aggiungere questo codice nella pagina XML:


<?php
function data_select_after($ds
{
    global 
$xml;
       if (
$ds->getPropertyName("id")=="ds1"
    {
        
$ds2 $xml->getObjById("ds2");
        
$ds3 $xml->getObjById("ds3");
        
$result = array();
        
$i=0;
        while(
$row $ds->ds->dsGetRow())
        {
            
$key $row->key;
            
$result[$i]['tabella1campo1'] = $row->campo1;
            ............................
            
$result[$i]['tabella1campon'] = $row->campon;
            
$ds2->ds->dsConnect();
            
$ds2->ds->dsQuery("SELECT ........... FROM `tabella2` WHERE `tabella2`.`tab1key` = '".$key."'");
            while(
$row $ds2->ds->dsGetRow())
            {
                
$result[$i]['tabella2campo1'] = $row->campo1;
                ............................
                
$result[$i]['tabella2campom'] = $row->campon;
            }        

            
$ds3->ds->dsConnect();
            
$ds3->ds->dsQuery("SELECT ........ FROM `tabella3` WHERE `tabella3`.`tab1key` = '".$key."'");
            while(
$row $ds3->ds->dsGetRow())
            {
                
$result[$i]['tabella3campo1'] = $row->campo1;
                ............................
                
$result[$i]['tabella3campom'] = $row->campon;
            }
            
$i++;
        }
        
$ds->setProperty("xml"$xml->dataXML($result));     // output XML 
        // $ds->setProperty("xml", $xml->dataJSON($result)); // output JSON
        
return false;
    }
}
?>

In sostanza si modifica il risultato del ds1 al fine di ottenere un unico datasource contenente il risultato complessivo delle tre tabelle.