Boa biblioteca ORM PHP?

268

Existe uma boa biblioteca de mapeamento de objeto-relacional para PHP?

Eu conheço o PDO / ADO, mas eles parecem fornecer apenas abstração das diferenças entre os fornecedores de banco de dados, não um mapeamento real entre o modelo de domínio e o modelo relacional. Estou procurando uma biblioteca PHP que funcione da mesma forma que o Hibernate para Java e o NHibernate para .NET.

Peter Mortensen
fonte

Respostas:

103

Experimente o RedBean , é necessário:

  • Nenhuma configuração
  • Sem banco de dados (ele cria tudo rapidamente)
  • Nenhum modelo
  • etc.

Ele ainda faz todo o bloqueio e transações para você e monitora o desempenho em segundo plano. (Droga! Até faz coleta de lixo ....) O melhor de tudo ... você não precisa escrever uma única ... linha de código ... Jesus esta , camada ORM , me salvou!

jnewman
fonte
9
redbean é de longe a melhor camada de abstração de banco de dados com a qual já trabalhei. não "um dos melhores" - o melhor.
Nir Gavish
Achado muito bom. Estou muito impressionado com este ORM para dizer o mínimo
Christopher Tarquini
1
Compare o RedBean com a Doutrina: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... jesus Eu li a primeira parte da documentação e isso me fez rir de um ditador sinistro, e já estou baixando!
KJW
45

Existem apenas dois bons: Doutrina e Propel . Nós somos a favor do Doctrine, e ele funciona bem com o Symfony . No entanto, se você estiver procurando por suporte ao banco de dados, além dos principais, precisará escrever seu próprio código.

Peter Mortensen
fonte
Propel é muito bom para os padrões php. Ele produz um código razoavelmente limpo que é compatível com IDE com getters e setters e um sistema de abstração de Critérios muito limpo para consultas.
0x6A75616E 02/09
Como essa pergunta se vincula bastante à SO, gostaria de salientar que o Propel é um projeto descontinuado a partir de 2020. A compatibilidade do PHP7 nunca foi implementada. Portanto, escolher a Propel como ORM para um novo projeto de software em 2020 não é uma boa ideia.
mrodo 28/02
34

O Axon ORM faz parte do Framework sem gordura - ele possui um mapeador instantâneo. Não há geradores de código. Nenhum arquivo de configuração XML / YAML estúpido . Ele lê o esquema do banco de dados diretamente do back-end, portanto, na maioria das operações CRUD , você nem precisa estender um modelo base. Ele funciona com todos os principais mecanismos de banco de dados suportados por DOP : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL , etc.

/* SQL */
CREATE TABLE products (
    product_id INTEGER,
    description VARCHAR(128),
    PRIMARY KEY (product_id)
);

/* PHP */
// Create
$product=new Axon('products'); // Automatically reads the above schema
$product->product_id=123;
$product->description='Sofa bed';
$product->save(); // ORM knows it's a new record

// Retrieve
$product->load('product_id=123');
echo $product->description;

// Update
$product->description='A better sofa bed';
$product->save(); // ORM knows it's an existing record

// Delete
$product->erase();

Acima de tudo, o plug-in e a camada de acesso a dados que o acompanha são tão leves quanto a estrutura: 14 KB (Axon) + 6 KB (SQLdb). Sem gordura é apenas 55 KB.

ainda
fonte
15
Sempre me preocupa quando vejo algo como $product->load('product_id=123')em um exemplo.
Znarkus
9
para paranóicos, a sintaxe alternativa é$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
4
O Fat-Free também possui ORSs NoSQL para MongoDB e arquivos simples
bcosca
28

Estou desenvolvendo o Pork.dbObject por conta própria. (Uma implementação simples do ORM do PHP e do Active Record) O principal motivo é que acho a maioria dos ORMs muito pesados.

O principal pensamento do Pork.dbObejct é ser leve e simples de configurar. Nenhum monte de arquivos XML, apenas uma chamada de função no construtor para ligá-lo e um addRelation ou addCustomRelation para definir uma relação com outro dbObject.

Dê uma olhada: Pork.dbObject

SchizoDuckie
fonte
1
Eu estava procurando uma implementação leve de ORM do PHP hoje e encontrei o Pork.dbObject graças a este post. Funciona muito bem! 1
E Dominique
6
Duude! Isso é bem interessante. Vejo que a atualização mais recente aconteceu em algum lugar de '09. Isso ainda é mantido? Se não ... Eu só pode revivê-la :)
VladFr
22

Tente Doctrine2 . É provavelmente a ferramenta ORM mais poderosa para PHP. Estou mencionando isso separadamente do Doctrine 1, porque é um software completamente diferente. Foi reescrito do zero, ainda está na fase beta, mas é utilizável agora e desenvolvido.

É um ORM muito complexo, mas bem projetado. Muita magia da Doutrina 1 original desapareceu. Ele fornece uma solução completa e você pode escrever seu próprio ORM sobre o Doctrine2 ou usar apenas uma de suas camadas .

tomp
fonte
O único problema que consigo pensar no Doctrine2 é que ele depende do PHP 5.3 ou superior.
Jblue 20/09/10
8
@ jblue: Não é um problema, é uma característica ;-). Bibliotecas grandes como o Doctrine precisam de espaços para nome.
Tom Pažourek
“Muita magia da Doutrina 1 original desapareceu.” - Em que sentido isso é positivo?
Olivier 'Ölbaum' Scherler
13

Comecei com o Kohana e parece o mais próximo do Ruby on Rails sem invocar toda a complexidade de vários arquivos de configuração, como o Propel .

Zak
fonte
Também concordo que o Kohana é a estrutura mais semelhante ao RoR no mundo PHP. Tudo o que falta são andaimes e, com o suporte da CLI no KO3, é apenas uma questão de alguém arregaçar as mangas e fazer isso.
Phillip Whelan
12

Confira o Outm ORM . É mais simples que o Propel e o Doctrine e funciona de maneira semelhante ao Hibernate, apenas com uma aparência mais PHP.

Alvaro
fonte
3
Eu tentei isso. Eu tive que especificar as mesmas propriedades do objeto em 3 locais - configuração, modelo e esquema do banco de dados. É muito trabalho para implementar uma IMO ORM.
mixdev
A saída é muito pesada para configuração.
Lotus Notes
Eu tentei isso (1.0 RC1) e era muito buggy mesmo na funcionalidade funcional do núcleo. E sim, há muita configuração para escrever. Eu não recomendo.
Szymon Wygnański
11

Eu realmente gosto do Propel , aqui você pode obter uma visão geral, a documentação é muito boa e pode ser obtida através do PEAR ou SVN.

Você só precisa de uma instalação funcional do PHP5 e do Phing para começar a gerar classes.

CMS
fonte
A Propel também pode 'fazer engenharia reversa' de um esquema de banco de dados existente - criando objetos PHP a partir da leitura do esquema de banco de dados.
David Goodwin
8

Encontrei classes relacionadas ao ORM na biblioteca PHP Flourish .

VDVLeon
fonte
6

Dê uma chance ao dORM, um mapeador relacional de objetos para PHP 5 . Ele suporta todos os tipos de relacionamentos (1 para 1), (1 para muitos), (muitos para muitos) e tipos de dados. É completamente discreto: não é necessária geração de código ou extensão de classe. Na minha opinião, é superior a qualquer ORM existente, incluindo Doutrina e Propel. No entanto, ele ainda está na versão beta e pode mudar significativamente nos próximos dois meses. http://www.getdorm.com

Também possui uma curva de aprendizado muito pequena. Os três métodos principais que você usará são:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);
Olivier Lalonde
fonte
4

Atualmente, estou trabalhando no phpDataMapper , que é um ORM projetado para ter sintaxe simples como o projeto Datamapper do Ruby. Ainda está em desenvolvimento inicial, mas funciona muito bem.

Vance Lucas
fonte
4

Eu tive ótimas experiências com Idiorm e Paris . Idiorm é uma biblioteca ORM pequena e simples. Paris é uma implementação do Active Record igualmente simples, criada no Idiorm. É para PHP 5.2+ com DOP. É perfeito se você quer algo simples que você pode simplesmente inserir em um aplicativo existente.

Sander Marechal
fonte
4

Tentei o ORM da biblioteca do Flourish .

eaguilar
fonte
Sim, estou trabalhando com isso há algum tempo. O flourishlib é ótimo, mas o ORM ainda tem algum trabalho a fazer. Trabalhando com tabelas de junção que possuem propriedades adicionais ou chaves estrangeiras, a criação de novos objetos pode ser um pouco entediante. Trabalhar com modelos simples é fácil. Dê uma olhada no Repose ORM ou Outlet para um ORM alternativo para PHP.
Michael
3

Até o lançamento do PHP 5.3, não espere ter um bom ORM. É uma limitação OO do PHP.

knoopx
fonte
Então, como o PHP 5.3 ajudaria alguém a escrever um ORM melhor? Não vejo razão.
Ionuţ G. Stan
8
o principal motivo é a introdução da ligação estática tardia (palavra-chave "estática"). leia sobre isso no blog.felho.hu/…
knoopx
2
O ORM realmente não precisa de variáveis ​​estáticas, elas podem ser bem projetadas usando apenas variáveis ​​de instância.
Tom Pažourek
É verdade que a ligação estática tardia é a razão pela qual eu posso obter cada instância do ORM do meu ORM tão baixa . Antes da ligação estática tardia, era tão inútil quanto a maioria das outras.
Xeoncross
3

Meu amigo Kien e eu aprimoramos uma versão anterior de um ORM que ele havia escrito antes do PHP 5.3. Nós transportamos essencialmente o Active Record do Ruby on Rails para o PHP. Ainda faltam alguns dos principais recursos que desejamos, como transações, suporte à chave primária composta, mais alguns adaptadores (apenas o MySQL e o SQLite 3 funcionam no momento). Mas, estamos muito perto de terminar essas coisas. Você pode dar uma olhada no PHP ActiveRecord com o PHP 5.3 .

Jacques Fuentes
fonte
3

Experimente o PHP ADOdb.

Não posso dizer que é o melhor, porque não usei os outros. Mas é rápido, suporta Memcached e cache.

E é muitíssimo mais rápido que o DB / Select do Zend Framework .

Peter Mortensen
fonte
2
O adodb se presta mais ao sabor Thin Model / Fat Controller, que geralmente não é uma coisa boa.
Jblue 20/09/10
O ADOdb possui um ORM (mas não é apenas um ORM). Geralmente, é uma solução realmente ótima, funciona muito melhor do que o Zend para DB (além de ser mais lento que o ADOdb, o Zend DB possui apenas suporte JOIN limitado), suporta escape automático com parametrização (ao contrário de Doctrine) possui um design de cache extensível e agradável com integração super fácil do memcache. Eu não acho que seja preciso dizer que isso se presta a uma implementação "Thin Model / Fat Controller" (você pode fazer isso ou não, mas o design do ADOdb não favorece uma maneira ou de outra).
Iain Collins
3

Dê uma olhada no LEAP ORM for Kohana . Ele funciona com vários bancos de dados, incluindo DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL e SQLite . Com uma função de carregamento automático simples, ele pode funcionar com praticamente qualquer estrutura PHP. O código fonte está no GitHub em https://github.com/spadefoot/kohana-orm-leap . Você pode conferir os tutoriais do LEAP on-line.

A biblioteca ORM trabalha com chaves primárias não inteiras e chaves compostas. As conexões são gerenciadas por meio de um pool de conexões com o banco de dados e funcionam com consultas SQL brutas. O ORM ainda possui um construtor de consultas que simplifica a construção de instruções SQL.

Matthew
fonte
2

Você pode conferir Repose se estiver se sentindo aventureiro. Como o Outlet , ele é modelado após o Hibernate .

Ainda é muito cedo em seu desenvolvimento, mas até agora as únicas restrições no modelo de domínio são que as classes não são marcadas como finais e as propriedades não são marcadas como privadas. Quando eu chegar ao PHP> = 5.3, tentarei implementar o suporte a propriedades particulares também.

Beau Simensen
fonte
2

Se você estiver procurando por um ORM que implemente o paradigma do Mapeador de Dados em vez do Active Record especificamente, sugiro que você dê uma olhada no GacelaPHP .

Recursos do Gacela:

  • Mapeador de dados
  • Mapeamento de chave estrangeira
  • Mapeamento de associação
  • Mapeamento dependente
  • Herança de mesa em concreto
  • Objeto de consulta
  • Mapeamento de metadados
  • Carregamento lento e ansioso
  • Suporte completo ao Memcached

Outras soluções ORM são muito inchadas ou têm limitações onerosas ao desenvolver algo remotamente complicado. O Gacela resolve as limitações da abordagem de registro ativo implementando o Padrão do Mapeador de Dados, mantendo o mínimo de inchaço usando o PDO para todas as interações com o banco de dados e o Memcached.

Noah Goodrich
fonte
2

O MicroMVC possui um ORM de 13 KB que depende apenas de uma classe de banco de dados de 8 KB . Ele também retorna todos os resultados como objetos ORM e usa ligação estática tardia para evitar a incorporação de informações sobre a tabela e metadados do objeto atual em cada objeto. Isso resulta na sobrecarga ORM mais barata que existe.

Funciona com MySQL , PostgreSQL e SQLite .

Peter Mortensen
fonte
2

ORM brasileiro: http://www.hufersil.com.br/lumine . Funciona com PHP 5.2 ou superior. Na minha opinião, é a melhor escolha para portugueses e brasileiros, pois possui documentação fácil de entender e muitos exemplos para download.

Paulo Araujo
fonte
2

O Agile Toolkit possui sua própria implementação exclusiva de ORM / ActiveRecord e SQL dinâmico .

Introdução: http://agiletoolkit.org/intro/1

Sintaxe (registro ativo):

$emp=$this->add('Model_Employee');
$emp['name']='John';
$emp['salary']=500;
$emp->save();

Sintaxe (SQL dinâmico):

$result = $emp->count()->where('salary','>',400)->getOne();

Embora o SQL dinâmico e o Active Record / ORM possam ser usados ​​diretamente, o Agile Toolkit os integra ainda mais à interface do usuário e à interface do usuário do jQuery . Isso é semelhante ao JSF, mas escrito em PHP puro.

$this->add('CRUD')->setModel('Employee');

Isso exibirá CRUD AJAXified com o modelo para funcionário.

romaninsh
fonte
2

NotORM

include "NotORM.php";
 $pdo = new PDO("mysql:dbname=software");
 $db = new NotORM($pdo);
 $applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
foreach ($applications as $id => $application) {
echo "$application[title]\n";
}
Charlie Chai
fonte
2

PHP ORM Faces Para extensão DOP. Veja PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Kurt
fonte
1. O site é turco; 2. Seu código não é nada diferente do código que você usaria com, por exemplo, Doctrine.
O Pellmeister
1

Outro ótimo ORM PHP de código aberto que usamos é o PHPSmartDb . É estável e torna seu código mais seguro e limpo. A funcionalidade do banco de dados é a mais fácil que já usei no PHP 5.3.

Joe
fonte
1

A doutrina é provavelmente a sua melhor aposta. Antes do Doctrine, o DB_DataObject era essencialmente o único outro utilitário aberto.

anon
fonte
1

Se você procura um ORM, como o Hibernate , deve consultar o PMO .

Ele pode ser facilmente integrado a uma arquitetura SOA (existe apenas uma classe de serviço da web a ser desenvolvida).

anônimo
fonte