1   2   3   4   5   6   7   8  ...

Propel. Porady

2. Porada #2: Korzystanie z kilku baz danych

Skrypt PHP może — za pośrednictwem propelowych obiektów — łączyć się z wieloma bazami danych.

Przed uruchomieniem generatora klas (tj. skryptu propel-gen.bat) w pliku runtime-conf.xml należy wymienić wszystkie bazy danych:

<datasources default="osoby">
  <datasource id="osoby">
    <adapter>mysql</adapter>
    <connection>
      <phptype>mysqli</phptype>
      <hostspec>localhost</hostspec>
      <database>osoby</database>
      <username>osobyadm</username>
      <password>osobypass</password>
      <encoding>utf8</encoding>                    
    </connection>
  </datasource>
  <datasource id="wyrazy">
    <adapter>mysql</adapter>
    <connection>
      <phptype>mysqli</phptype>
      <hostspec>localhost</hostspec>
      <database>wyrazy</database>
      <username>wyrazyadm</username>
      <password>wyrazypass</password>
      <encoding>utf8</encoding>                    
    </connection>
  </datasource>            
</datasources>

Dla każdego wymienionego źródła danych przygotowujemy osobny plik XML z opisem struktury bazy, np.

wyrazy-schema.xml
osoby-schema.xml

Tak skonfigurowany Propel wygeneruje plik konfiguracyjny -conf.php, umożliwiający łączenie się obiektów z wieloma bazami, przy czym wszystkie wygenerowane klasy trafią do jednego folderu.

Jeśli w pliku build.properties dodasz wpis:

propel.packageObjectModel = true

zaś w plikach -schema.xml umieścisz atrybut package:

<database package="wyrazy" name="wyrazy" ... >

to generowane klasy zostaną umieszczone w osobnych folderach. Atrybut package zawierający kropkę:

package="core.system"

spowoduje dalszy podział generowanych folderów na podfoldery:

core/system

W skrypcie PHP, który korzysta z kilku połączeń należy najpierw wywołać metodę init():

Propel::init('dwiebazy-conf.php');

a następnie utworzyć zmienne umożliwiające korzystanie z połączeń:

$con_osoby = Propel::getConnection('osoby');
$con_wyrazy = Propel::getConnection('wyrazy');

Metody pobierające rekordy z baz danych otrzymają dodatkowy parametr ustalający połączenie:

$wyrazy = WyrazPeer::doSelect(new Criteria, $con_wyrazy);
$osoby = OsobaPeer::doSelect(new Criteria, $con_osoby);

Pierwsza z powyższych instrukcji pobiera dane z bazy o nazwie wyrazy, a druga — z bazy o nazwie osoby.

Utworzone obiekty nie wymagają podawania połączenia. Korzystamy z nich identycznie jak w skryptach, które stosowały jedną bazę danych:

echo $osoby[0]->getImie()

$wyrazy[0]->setWyraz('Lorem');
$wyrazy[0]->save();
 1   2   3   4   5   6   7   8  ...