Falando em Mapeamento Objeto Relacional e Persistência de dados... ah, ops, eu ainda não falei sobre isso.
Dica rápida: Para quem esta procurando um framework de persistência e/ou ORM para PHP, tenho usado dois que acho muito bons:
Os dois são BEM diferentes, mas ambos servem ao mesmo propósito: facilitar a vida do desenvolvedor, quando o assunto é banco de dados.
O Doctrine seque o padrão Active Record (aquele do rails, cake...), que é o padrão da moda. Este framework chegou a versão 1.0, é muito estável e traz uma gama imensa de recursos. Um exemplo rápido de como configurar uma classe com ele:
<?
class User extends Doctrine_Record {
public function setTableDefinition() {
$this->setTableName('users');
$this->index("id");
$this->hasColumn("id","integer",11,array("primary" => true,"unique" => true));
$this->hasColumn('name','string',220);
$this->hasColumn('email','string',220);
$this->hasColumn('pwd','string',220);
$this->hasColumn('phone','string',220);
$this->hasColumn('sip','string',220);
$this->hasColumn('callback','boolean');
$this->hasColumn('admin','boolean');
}
public function setUp() {
$this->hasMany("Contact as catalog",array("local" => "id", "foreign" => "id_user"));
}
}
?>
Está pronto. Como fazer uma query simples:
$users = Doctrine::getTable("User")->find($id);
E uma mais complexa(Artigos e Pontos são classes distintas, e existe um join em Artigos para Pontos):
$artigos = Doctrine_Query::create()->from("Artigos a")->innerJoin("a.pontos p")->limit($count)->orderBy("a.pontos DESC")->execute();
Interessante não? O resto é padrão do Active Record, para salvar por exemplo basta chamar save() no próprio objeto. Existe material sobre este framework na internet, e é relativamente bem documentado.
O doctrine ainda permite muito mais coisas, como arquivos de configurações, schemas, pode criar as tabelas para você, pode criar as classes...
Porem, eu não gosto do Active Record, acho que é uma falha de modelagem, dão muita responsabilidade para a classe do modelo. Por isso busquei uma outra opção, então depois de muito buscar (muito mesmo, já que AR é a moda) achei o Outlet.
O Outlet tem tudo que eu gosto em um framework, é simples, são poucos arquivos, desacoplado, api enxuta e bem flexivel. Ele faz apenas o que se propõe. Ainda não testei ele completamente, mas parece bem promissor.
O uso do outlet é bem simples, você constroi seu modelo normalmente(sem extender nada, sem modificar nada) e faz a configuração em um array descrevendo as classes, como este:
<?
return array (
'connection' => array(
'dsn' => 'mysql:host=localhost;dbname=libhertz',
'username' => 'admin',
'dialect' => 'sql',
'password' => '123'),
'classes' => array(
'User' => array(
'table'=>'users',
'props'=>array(
'id'=> array('id','int',array('pk'=>true,'autoIncrement'=>true)),
'name'=>array('name','varchar'),
'email'=>array('email','varchar'),
'phone'=>array('phone','varchar'),
'sip' =>array('sip','varchar'),
'callback'=>array('callback','int'),
'admin'=>array('admin','int'),
'pwd'=>array('pwd','varchar')
),
'associations'=>array(
array('one-to-many','Contact',array('key'=>'id_user','name'=>'catalog','plural'=>'catalog'))
)
),
'Contact' => array(
'table'=>'contacts',
'props'=>array(
'id'=>array('id','int',array('pk'=>true,'autoIncrement'=>true)),
'name'=>array('name','varchar'),
'id_user'=>array('id_user','int'),
'phone'=>array('phone','varchar'),
'fastPhone'=>array('fast_phone','varchar')
)
)
)
) ;
?>
Chamamos o outlet através de seu singleton:
$outlet = Outlet::getInstance();
E então usamos seus recursos, como:
- $outlet->save($obj);
- $user = $outlet->load('User',$id);
- $users = $outlet->load('User','Where {User.name} = ?',array('Diogo'));
- $users = $outlet->load('User',”Where {User.name} = 'Diogo'”);
- $outlet->delete($obj);
A documentação no site do Outlet é muito boa na minha opnião, este é , atualmente, meu favorito.
Ficam ai as dicas, alguêm tem algum para recomendar?
UPDATED!!!
Com a dica do Luiz nos comentários lembrou o Framework Brasileirissimo Lumine de mapeamento de banco de dados para PHP. que merece destaque.
Com uma forte inspiração do Hibernate do java, um mega-framework de persistência para java, e do DB_DataObject, do PEAR. Mas sem a pior parte(na minha opnião) do Hibernate: Sem XML! Ele usa um recurso de engenharia reversa do banco de dados para gerar a configuração.
Ainda não tive a oportunidade de usa-lo, mas entrou na lista de tarefas com boa prioridade. Então espere em breve comentários sobre este Framework, o Lumine.
- Comments
-
|2008-09-19 22:43:07 adminBoa Luiz! Ainda mais por ser brazuca.
Adcionei ao texto, parece estar bem legal mesmo, vou tentar fazer um teste assim que possivel.
-
|2009-01-09 14:46:44 Chris BenselerAh, vi seu post de hoje com a lista dos melhores de 2008 e vim ver, já pensando no Lumine. Aí vi o update! hehe
Acho mto bom o Lumine, os demais vou conhecer agora com as indicações!
Abraço!
-
|2009-01-09 15:12:53 adminShame on me, ainda não o testei, tisc tisc tisc.
-
|2010-03-30 18:43:34 Evertoncara, estou com um problema na conf do Doctrine.
Ainda nao consegui fazer ele rodar.
Estou usando banco de dados MS SQL SERVER, windows, zend server.o mssql ja esta configurado no PHP.INI
O erro que aparece é o seguinte:
Debug Error: /Questionario/lib/Doctrine/Connection.php line 486 - Uncaught exception 'Doctrine_Connection_Exception' with message 'Couldn't locate driver named mssql' in D:Apache2htdocsQuestionariolibDoctrineConnection.php:486
Stack trace:
#0 D:Apache2htdocsQuestionariolibDoctrineConnection.php(1001): Doctrine_Connection->connect()
#1 D:Apache2htdocsQuestionariolibDoctrineConnectionMssql.php(318): Doctrine_Connection->execute('SELECT name FRO...', Array)
#2 D:Apache2htdocsQuestionariolibDoctrineConnection.php(850): Doctrine_Connection_Mssql->execute('SELECT name FRO...', Array)
#3 D:Apache2htdocsQuestionariolibDoctrineImportMssql.php(166): Doctrine_Connection->fetchColumn('SELECT name FRO...')
#4 D:Apache2htdocsQuestionariolibDoctrineImport.php(382): Doctrine_Impor...
-
|2010-03-30 19:45:21 Diogo SouzaEverton, você consegue usar o mssql em scripts fora do Doctrine, usando o PDO?
Além do mssql (php_mssql) você precisa ter configurado também o pdo_mssql (php_pdo_mssql).
-
|2010-06-08 13:24:38 EvertonDiogo, os dois estao habilitados.(php_mssql e php_pdo_mssql)
Eu consigo usar o mssql em scripts fora do Doctrine tranquilamente.
o Erro que esta dando é: couldn't locate driver named mssql
a versao do mssql eh o 2008.





