ORMs do PHP: doutrina versus propulsão


126

Estou iniciando um novo projeto com o symfony, que é prontamente integrado ao Doctrine e ao Propel , mas é claro que preciso fazer uma escolha ... Fiquei me perguntando se as pessoas mais experientes por aí têm prós e / ou contras em geral. qualquer um desses dois?

Muito obrigado.

EDIT: Obrigado por todas as respostas, coisas úteis. Não há uma resposta realmente correta para essa pergunta, então vou marcar como aprovada a que obteve os votos mais populares.


5
Pessoal, existem respostas atualizadas? Vendo que desta forma fora da data
Qiniso

Respostas:


76

Eu iria com Doutrina. Parece-me que é um projeto muito mais ativo e, sendo o ORM padrão do symfony, ele é melhor suportado (mesmo que oficialmente os ORMs sejam considerados iguais).

Além disso, eu gosto mais da maneira como você trabalha com consultas (DQL em vez de Critérios):

<?php
// Propel
$c = new Criteria();
$c->add(ExamplePeer::ID, 20);
$items = ExamplePeer::doSelectJoinFoobar($c);

// Doctrine
$items = Doctrine_Query::create()
       ->from('Example e')
       ->leftJoin('e.Foobar')
       ->where('e.id = ?', 20)
       ->execute();
?>

(A implementação da Doutrina é muito mais intuitiva para mim).

Além disso, eu realmente prefiro a maneira como você gerencia as relações no Doctrine.

Acho que vale a pena ler esta página da documentação do Doctrine: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Resumindo: se eu estivesse iniciando um novo projeto ou tivesse que escolher entre aprender Doutrina e Propel, eu iria para Doutrina qualquer dia.


42
No Propel 1.5, essa consulta também pode ser escrita como Example_Query :: create () -> joinWith ('FooBar') -> filterId (20) -> find () (ou findPK (20) após o joinWith se Id for o seu principal chave). Como você pode ver, ele usa a boa sintaxe do Doctrine e adiciona um pouco mais. O lançamento está planejado para o final do primeiro trimestre de 2010, mas você pode testá-lo agora em seus projetos Symfony.
Jan Fabry

Input bom, eu não sabia que :-)
phidah

9
a implementação da doutrina me parece muito mais complexa. Obter Entidade gerenciar get repositório ... isto e aquilo
SoWhat

1
doutrina é mais de complicar as coisas ... apenas notorm é o caminho a percorrer
Geomorillo

40

Sou tendencioso, já que ajudo um pouco na próxima versão do Propel, mas você deve considerar que o Propel foi realmente o primeiro ORM disponível, e ficou um pouco atrasado quando o Doctrine foi criado, mas agora tem desenvolvimento ativo novamente. O Symfony 1.3 / 1.4 vem com o Propel 1.4, onde a maioria das comparações pára no Propel 1.3. Além disso, a próxima versão do Propel (1.5) conterá muitas melhorias, especialmente na criação de seus Critérios (resultando em menos código para você escrever).

Eu gosto do Propel porque parece ser menos complexo que o Doctrine: a maioria dos códigos está nas poucas classes geradas, enquanto o Doctrine dividiu a funcionalidade em várias classes. Eu gosto de ter um bom entendimento das bibliotecas que estou usando (não muito "mágica"), mas é claro que tenho mais experiência com o Propel, então talvez a Doutrina não seja tão complicada nos bastidores. Alguns dizem que o Propel é mais rápido, mas você deve verificar isso por conta própria e considerar se isso supera outras diferenças.

Talvez você deva considerar também a disponibilidade dos plugins Symfony para as diferentes estruturas. Acredito que o Propel tenha uma vantagem aqui, mas não sei quantos dos plugins listados ainda estão atualizados com a versão mais recente do Symfony.


4
As novas melhorias de consulta no Propel 1.5 são realmente boas.
Tom

23

Isso se trata de preferência pessoal. Eu uso o Propel porque (entre outras coisas) gosto do fato de que tudo tem seu próprio método getter & setter concreto. Em Doutrina, esse não é o caso.

Impulsionar:

$person->setName('Derek');
echo $person->getName();

Doutrina:

$person->name = 'Derek';
echo $person->name;

A razão pela qual eu gosto de ter getters e setters é que posso colocar todo tipo de lógica neles, se necessário. Mas essa é apenas a minha preferência pessoal.

Devo acrescentar também que, embora o Propel tenha se movido lentamente no passado, ele agora está em desenvolvimento ativo novamente. Ele lançou várias novas versões nos últimos meses. A versão mais recente do Propel inclui uma "interface de consulta fluente" semelhante à do Doctrine , para que você não precise mais usar os Critérios se não quiser.


7
no Doctrine, você pode substituir setters e getters para cada propriedade e também possui lógica personalizada (consulte doctrine-project.org/documentation/manual/1_2/en/… - procure ATTR_AUTO_ACCESSOR_OVERRIDE para chegar à seção relevante)
Marek Karbarz

Parece bom, mas você ainda define a propriedade chamando: $ x-> propname = 'abc'; Isso é problemático porque não parece suportar a passagem de vários parâmetros.
lo_fye

20

Deve-se notar Doutrina 2 é atualmente em desenvolvimento lançado [ed] e funções quase completamente diferente da versão estável atual de Doutrina 1. Ele se baseia no padrão Data Mapper vez de Active Record, e usa um 'gerenciador de entidade' à persistência punho lógica. Quando lançado, ele terá uma semelhança mais próxima com o Hibernate do Java (a Doutrina 1 é mais parecida com o ActiveRecord do Rails).

Estou desenvolvendo com a versão alfa da Doutrina 2 e devo dizer que ela está acima da Doutrina 1 (apenas minha opinião, e nunca usei Propel). É bem provável que a comunidade de Doutrina se mova em direção a ela quando for lançada.

Gostaria de encorajá-lo a conferir o Doctrine, mas se você preferir o estilo Active Record que o Propel e o Doctrine usam agora, convém ficar com o Propel.


4
Uma versão estável do Doctrine 2 foi lançada recentemente. doctrine-project.org/blog/doctrine2-released
Trevor Allred

5

As duas referências estão um pouco desatualizadas, portanto, você cobre algumas generalidades. Basicamente, você teria que avaliar sua experiência com a estrutura, uma grande desvantagem da doutrina é a incapacidade de ter um IDE que permita o código automático dessa propulsão. vencedor, as curvas de aprendizado propulsão e doutrina são muito diferentes, é mais fácil impulsionar, se seu projeto precisar gerenciar um modelo de dados complexo, use doutrina, se você quiser trabalhar rapidamente com um ORM que seja melhor documentado e encontrar mais suporte no Propel Os usos da Internet, são muito mais maduros e acredito que os mais utilizados.

http://propel.posterous.com/propel-141-is-out


No mundo do symfony, parece que Doctrine é definitivamente o mais usado - especialmente para projetos mais recentes. Obviamente, existem muitos projetos do sf 1.0 que ainda usam o Propel porque o Doctrine não estava disponível para o symfony até a 1.1.
Phdeh

5

Eu sugiro usar o propel 1.6, que é melhor para a função de preenchimento automático do IDE.


26
-1 Autocompletion de uma IDE não deve ser a razão de uma escolha técnica
Clement Herreman

14
@ClementHerreman Concordo que não deve ser o critério, mas acredito que o quão produtivo alguém possa ser com uma determinada tecnologia certamente deve ser um motivo para escolhê-la. E com todo o respeito, portanto, discordo do seu voto negativo ... independentemente de você concordar com a resposta, não é "errado" (ou é?) E é de alguma utilidade (a menos que esteja errado, nesse caso) , você deve indicar isso).
Sepster

2
IMO: se sua produtividade é mais aprimorada pelo preenchimento automático, em vez de qualidade, intuitividade e consistência de software, algo estranho está acontecendo. Consulte codinghorror.com/blog/2009/01/… . Mas você está certo, em algum momento essa resposta não está errada , apenas não é boa o suficiente, talvez até não seja boa.
Clement Herreman

1
@ClementHerreman, se não for útil, não use mais;), +1
amd

Existem respostas atualizadas para isso? Isso está desatualizado.
Qiniso 7/05

2

Eu não sou usuário do ORM fora da estrutura do PHP 5, mas aqui estão algumas boas postagens de comparação (caso você ainda não as tenha visto):

http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/

http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine

Ambos os favoritos são favoritos para o Doctrine como uma nova geração de ORM para Symfony.


1
Para constar, essa comparação está totalmente desatualizada - a versão atual do Propel usa DOP, usa relacionamentos de muitos para muitos e possui ótima documentação. Também vale a pena considerar: alguns de nós preferem o estilo de consulta detalhado do construtor de critérios em vez de linguagens de consulta proprietárias como DQL - ele tem suporte a IDE e é uma classe, para que você possa estendê-lo. Ainda estou tentando escolher, mas vejo muitas vantagens para o Propel sobre o Doctrine, se você não se importa com a geração de código estático e pode ver as vantagens do código PHP "real" em oposição à linguagem de consulta proprietária , que é apenas uma sequência de caracteres para um IDE.
mindplay.dk

2

Depois de usar os dois por vários anos, prefiro o Propel 2 ao Doctrine simplesmente com base em como você constrói sua lógica de consulta. A doutrina é o mais aprofundada possível e o gerenciamento de muitos aspectos dela corresponde a esse nível de profundidade. O Propel sinto que existe uma maneira mais fluida e orientada a objetos de criar e gerenciar as interações de consulta.

Para mim, isso levou a menos código no modelo e mais estruturas em torno de como a lógica pode / será processada. Isso resultou na criação de muitas interações como funcionalidade comum. (Afinal, 90% do que você fará com um banco de dados será apenas um certo grau de operação bruta.)

No final, ambos são poderosos, gerenciáveis ​​e farão o trabalho. Meus projetos e interesses pessoais usam o Propel ORM 2 e projetos futuros, se ainda estiverem escritos em PHP, seguirão esse caminho.

Eu tenho usado os dois diariamente nos últimos 3-4 anos.


1

Eu sugiro usar o DbFinder Plugin . Na verdade, este é um plugin muito poderoso que suporta os dois e é bastante poderoso. Na verdade, eu gosto de usá-lo melhor do que qualquer um.


@ Mike: obrigado, não sabia sobre o plugin, mas parece que ele suporta apenas o Sf1.2. Acabei indo com o Doctrine no final, parece que foi a escolha certa, embora seja necessário escrever SQL direto para as coisas mais complexas.
Tom

-2

Se não estou errado, os dois ORMs usam esquema baseado em XML, e a criação dessa definição de esquema é bastante complicada. Se você precisar de um esquema simples baseado em PHP com estilo fluente. Você pode tentar o LazyRecord https://github.com/c9s/LazyRecord, que suporta migração automática e geradores de script de upgrade / downgrade. E todos os arquivos de classe são gerados estaticamente sem custo de tempo de execução.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.