[horde] Horde 4 with oci8

Luis Felipe Marzagao/Andamentos lfbm.andamentos at gmail.com
Thu Apr 21 00:45:44 UTC 2011


Em 20/04/11 01:24, Chuck Hagenbuch escreveu:
> Quoting Luis Felipe Marzagao/Andamentos <lfbm.andamentos at gmail.com>:
>
>> By the way, has the horde project ever considered using Doctrine 
>> (http://www.doctrine-project.org/)?
>>
>> I'm doing some tests and it seems to integrate and work pretty nice. 
>> That way wrinting code just once would already provide support for 
>> the most important dbases (oracle, mysql, postgre, microsoft sql 
>> server etc.).
>>
>> In case it has already been considered, why wasn't it incorporated?
>
> It was discussed at least a little. Personally, it didn't fit with how 
> I wanted Horde_Db to work. And I really don't like the XML-heavy 
> configuration that was used, at least the last time I looked at it.
>
> I didn't undertake fleshing out Horde_Db lightly, but I think it's 
> been a worthwhile library already.
>
> -chuck
Nice to know it has been analysed.

I started toying with Doctrine 1.2.3. Let me share my experience with it 
so far.

At least for me there was absolutely no XML configuration at all.

Installed Doctrine via pear:

pear install pear.doctrine-project.org/Doctrine-1.2.3.tgz

Then, you only need to set a db schema once, and it can be yaml format, 
like this:

Cashier_Clients:
   tableName: cashier_clients
   columns:
     client_id as id: { type: string(32), primary: true }
     client_owner as owner: { type: string(255), notnull: true }
     client_name as name: { type: string(255), notnull: true }
     client_is_human as is_human: { type: boolean, notnull: true }
     client_tax_number as tax_number: { type: string(14), notnull: false }
   actAs:
     Searchable: { fields: [name, tax_number] }
   relations:
     Transactions: { class: Cashier_Transactions, local: id, foreign: 
client_id, type: many }
     Aliases: { class: Cashier_Aliases, local: id, foreign: client_id, 
type: many, cascade: [delete] }

The yaml file can be automatically created from an already existing db 
table or manually edited.
(... Doctrine_Core::generateYamlFromDb('Models/Yaml/schema.yml') ... );

(The searchable attribute automatically takes care of creating db 
columns for an indexing system in order to increase search performance, 
really handy!)

Then, this will generate the php classes (only needed once):

Doctrine_Core::generateModelsFromYaml(
     CASHIER_BASE . '/lib/Models/Schema/cashier_schema.yml',
     CASHIER_BASE . '/lib/Models')

To begin using it, bootstrap the doctrine core:

require_once 'Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));
Doctrine_Core::loadModels(CASHIER_BASE . '/lib/Models');

Then, set up a connection:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$conn = Doctrine_Manager::connection($dbh);

Then, use it, for example:

$id = 1;
$q = Doctrine_Query::create($conn)
            ->select('c.*, a.name')
            ->from('Cashier_Clients c')
            ->leftJoin('c.Aliases a')
            ->addWhere('c.id = ?', $id)

$result = $q->fetchOne();

Or, for example:

$clientTable = Doctrine_Core::getTable('Cashier_Clients');
$client = $clientTable->find('155b128a5d264564103464a773d780a9');
$client['name'] = 'John Doe';
$client->save();

And so on...

And the code will always be the above, no matter what db backend you 
have (mysql, oracle etc.). You only change the connection parameters 
according to your db backend.

Also, documentation from the project is really good.

I'm not an advanced progammer and I know this is no big news, but it 
seems pretty tight and easy for me. And is well documented and ready for 
major db backends.

Anyway, I managed to integrate it pretty nicely with Horde 3.

Just wanted to share the experience.

Luis Felipe



More information about the horde mailing list