PHP ORM : 교리와 프로 펠


126

교리 및 프로 과 쉽게 통합되는 심포니 로 새로운 프로젝트를 시작하고 있지만 물론 선택해야합니다 .. 이 둘 중 하나?

고마워

편집 : 모든 응답, 유용한 것들에 감사드립니다. 이 질문에 대한 정답은 없기 때문에 가장 인기있는 투표권을 얻은 사람을 승인 된 것으로 표시하겠습니다.


5
여러분, 업데이트 된 답변이 있습니까?
구식이 아닌

답변:


76

나는 교리와 함께 갈 것이다. 그것은 훨씬 더 활발한 프로젝트이며 심포니의 기본 ORM 인 것이 더 잘 지원됩니다 (공식적으로 ORM이 동일하다고 간주되지만).

또한 쿼리 작업 방식 (기준 대신 DQL)이 더 좋습니다.

<?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();
?>

(교리의 구현은 나에게 훨씬 직관적입니다).

또한 저는 교리에서 관계를 관리하는 방식을 선호합니다.

나는 Doctrine 문서 에서이 페이지를 읽을 가치가 있다고 생각합니다 : http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

요약하자면 : 새로운 프로젝트를 시작하거나 교리 학습과 프로 펠 학습 중 하나를 선택해야한다면 언젠가는 교리에 갈 것입니다.


42
Propel 1.5에서이 쿼리는 Example_Query :: create ()-> joinWith ( 'FooBar')-> filterId (20)-> find () (또는 Id가 기본 인 경우 joinWith 다음에 findPK (20))로 작성할 수도 있습니다. 키). 보시다시피, 그것은 Doctrine에서 멋진 구문을 취하고 조금 더 추가합니다. 이 릴리스는 2010 년 1 분기 말에 계획되어 있지만 Symfony 프로젝트에서 지금 테스트 할 수 있습니다.
Jan Fabry

좋은 의견, 나는 몰랐다 :-)
phidah

9
교리 이행은 훨씬 더 복잡해 보입니다. 엔티티 가져 오기 저장소 가져 오기 ... 이것과 저것
SoWhat

1
교리는 사물을 복잡하게 만들고 있습니다. 단지 규범은 갈 길입니다
Geomorillo

40

Propel의 다음 릴리스에서 약간의 도움을 주었으므로 편견이 있지만 Propel이 실제로 사용할 수있는 첫 번째 ORM임을 고려한 다음 Doctrine을 만들었을 때 약간의 지연이 있었지만 다시 개발이 활발해졌습니다. Symfony 1.3 / 1.4는 대부분의 비교가 Propel 1.3에서 끝나는 Propel 1.4와 함께 제공됩니다. 또한 Propel (1.5)의 다음 릴리스에는 특히 사용자 기준 작성 (작성할 코드가 적음)이 많이 향상되었습니다.

나는 Doctrine보다 덜 복잡해 보이기 때문에 Propel을 좋아합니다. 대부분의 코드는 생성 된 소수의 클래스에 있지만 Doctrine은 많은 클래스에서 기능을 분할했습니다. 나는 사용하고있는 라이브러리 (너무 "매직"은 아님)를 잘 이해하고 싶지만, 물론 Propel에 대한 경험이 더 많기 때문에 Doctrine은 배후에서 그렇게 복잡하지 않을 수 있습니다. 어떤 사람들은 프로 펠이 더 빠르다고 말하지만 직접 확인해야하며 이것이 다른 차이점보다 큰지 고려해야합니다.

다른 프레임 워크에 Symfony 플러그인의 사용 가능성도 고려해야합니다. Propel이 여기에 이점이 있다고 생각하지만 최신 버전의 Symfony를 사용하여 나열된 플러그인 중 몇 개가 여전히 최신인지 알 수 없습니다.


4
Propel 1.5의 새로운 쿼리 개선 사항은 정말 훌륭합니다.
Tom

23

그것은 개인 취향에 달려 있습니다. 나는 무엇보다도 Propel을 사용합니다. 교리에서는 그렇지 않습니다.

추진 :

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

교의:

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

내가 게터와 세터를 좋아하는 이유는 필요한 경우 모든 종류의 논리를 넣을 수 있기 때문입니다. 그러나 그것은 나의 개인적인 취향 일뿐입니다.

또한 Propel은 과거에는 느리게 움직 였지만 이제는 다시 활발하게 개발되고 있습니다. 지난 몇 달 동안 몇 가지 새로운 버전이 출시되었습니다. 가장 최신 버전의 Propel에는 Doctrine 's와 유사한 "유창한 쿼리 인터페이스"가 포함되어 있으므로 원하지 않는 경우 더 이상 기준을 사용할 필요가 없습니다.


7
교리 각 속성에 대한 세터와 게터을 무시하고 사용자 지정 논리를 가질 수 있습니다 ( doctrine-project.org/documentation/manual/1_2/en/... - ATTR_AUTO_ACCESSOR_OVERRIDE에 대한 검색 관련 섹션에 도착)
마렉 카르 바츠

괜찮아 보이지만 여전히 다음을 호출하여 속성을 설정합니다. $ x-> propname = 'abc'; 여러 매개 변수 전달을 지원하지 않는 것 같습니다.
lo_fye

20

또한 주목해야 교리 2현재 개발 출시 [ED] 교리 대신 액티브 레코드의 데이터 매퍼 패턴에 의존 1. 현재 안정 버전의 기능을 거의 완전히 상이하고, 핸들 지속성에 '엔티티 관리자'를 사용 논리. 출시되면 Java의 최대 절전 모드와 유사합니다 (교리 1은 Rails의 ActiveRecord와 유사합니다).

나는 Doctrine 2의 알파 릴리스로 개발 해 왔으며 그것이 Doctrine 1보다 머리와 어깨라고 말해야합니다 (제 의견으로는 Propel을 사용한 적이 없습니다). 교리 공동체가 공개 될 때 교리 공동체가 그것을 향해 나아갈 가능성이 높습니다.

교리를 확인하도록 권장하지만, Propel과 Doctrine이 현재 사용하는 Active Record 스타일을 선호한다면 Propel을 고수하고 싶을 것입니다.


4
Doctrine 2의 안정적인 버전이 최근에 발표되었습니다. doctrine-project.org/blog/doctrine2-released
Trevor Allred

5

두 참조는 다소 구식이기 때문에 일부 일반 사항을 다루지 만 기본적으로 프레임 워크에 대한 경험을 평가해야합니다. 교리의 주요 단점은 해당 추진에 자동 코딩 할 수있는 IDE를 사용할 수 없다는 것입니다. 승자, 학습 곡선 추진 및 교리가 매우 다르므로 프로젝트가 복잡한 데이터 모델을 관리하여 교리를 사용하여 복잡한 문서를 관리해야하는 경우 가장 잘 문서화 된 ORM으로 빠르게 작업하고 Propel에서 더 많은 지원을 받으려면 추진하기가 더 쉽습니다. 인터넷 사용은 훨씬 성숙하고 가장 많이 사용한다고 생각합니다.

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


심포니 세계에서 Doctrine은 특히 새로운 프로젝트에 가장 많이 사용되는 것으로 보입니다. 물론 Doctrine이 1.1까지 교향곡을 사용할 수 없었기 때문에 여전히 Propel을 사용하는 많은 sf 1.0 프로젝트가 있습니다.
phidah

5

IDE의 자동 완성 기능에 더 나은 propel 1.6을 사용하는 것이 좋습니다.


26
-1 IDE의 자동 완성이 기술적 선택의 이유가되어서는 안됩니다
Clement Herreman

14
@ClementHerreman 나는 그것이 안 동의 기준,하지만 난 확실히해야한다 특정 기술을 할 수있는 방법을 생산 한 생각 을 선택하는 이유. 그리고 전적으로 존중하여 나는 당신의 다운 투표에 동의하지 않습니다 ... 당신이 대답에 동의하는지 여부에 관계없이, 그것은 "잘못된"(또는 그렇지 않습니까?), 그리고 어떤 용도입니다 (잘못되지 않으면, 어떤 경우에도) , 이것을 명시해야합니다).
Sepster

2
IMO 소프트웨어 품질, 친밀감 및 일관성 대신 자동 완성 기능으로 생산성을 향상시키는 경우 이상한 일이 발생합니다. codinghorror.com/blog/2009/01/…를 참조하십시오 . 그러나 당신은 옳습니다. 어느 시점 에서이 대답은 잘못 되지 않았습니다. 충분하지 않거나 어쩌면 좋지 않습니다.
Clement Herreman

1
@ClementHerreman, 도움이되지 않으면 더 이상 사용하지 마십시오;), +1
amd

이에 대한 최신 답변이 있습니까? 이것은 구식입니다.
Qiniso

2

나는 PHP 5 비 프레임 워크 ORM 사용자가 아니지만 다음은 좋은 비교 게시물입니다 (아직 보지 못한 경우).

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

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

이 두 가지 결론은 교리에 대해 Symfony의 새로운 ORM 세대로 선호됩니다.


1
기록을 위해이 비교는 완전히 구식입니다. 현재 버전의 Propel은 PDO를 사용하고 다 대다 관계를 지원하며 훌륭한 문서를 가지고 있습니다. 또한 고려할 가치가 있습니다. 우리 중 일부는 DQL과 같은 독점 쿼리 언어보다 자세한 기준 작성기 쿼리 스타일을 선호합니다. IDE 지원 기능이 있으며 클래스이므로 확장 할 수 있습니다. 나는 여전히 선택하려고 노력하고 있지만 정적 코드 생성을 신경 쓰지 않고 독점 쿼리 언어와 달리 "실제"PHP 코드의 장점을 볼 수 있다면 Prot over Doctrine에 대한 많은 장점이 있습니다. IDE의 문자열입니다.
mindplay.dk

2

몇 년 동안 두 가지를 모두 사용한 후에는 쿼리 논리를 구성하는 방법에 따라 단순히 Propel 2를 Doctrine보다 선호합니다. 교리는 그것의 깊이 수준과 일치하는 그것의 많은 측면들을 얻고 관리 할 수있는만큼 깊이 있습니다. 내가 느끼는 Propel은보다 유동적이고 객체 중심적인 방식으로 쿼리 상호 작용을 구축하고 관리합니다.

나에게 이것은 모델의 코드가 적어지고 로직 처리 방법에 대한 더 많은 구조로 이어졌습니다. 이로 인해 많은 상호 작용이 공통 기능으로 구축되었습니다. (데이터베이스로 수행 할 작업의 90 %가 어느 정도 크루 드 작업이 될 것입니다.)

결국, 둘 다 강력하고 관리 가능하며 작업을 완료 할 것입니다. 저의 개인적인 프로젝트와 관심은 Propel ORM 2와 미래의 프로젝트를 사용합니다. PHP로 작성된 경우에는 그 경로를 사용하십시오.

지난 3-4 년 동안 매일 두 가지를 모두 사용해 왔습니다.


1

DbFinder Plugin 사용을 제안 합니다. 이것은 실제로 두 가지를 모두 지원하는 매우 강력한 플러그인이며 매우 강력합니다. 실제로 어느 쪽보다 사용하는 것이 좋습니다.


@ Mike : 감사합니다. 플러그인에 대해서는 몰랐지만 Sf1.2까지만 지원하는 것 같습니다. 결국 Doctrine을 사용하면서 결국에는 복잡한 선택에 직접 SQL 작성이 필요하지만 올바른 선택이라고 생각합니다.
Tom

-2

내가 틀리지 않으면 두 ORM 모두 XML 기반 스키마를 사용하며 이러한 스키마 정의를 만드는 것은 매우 번거 롭습니다. 유창한 스타일의 PHP 기반 단순 스키마가 필요한 경우. LazyRecord https://github.com/c9s/LazyRecord를 시도하면 자동 마이그레이션 및 업그레이드 / 다운 그레이드 스크립트 생성기를 지원합니다. 또한 모든 클래스 파일은 런타임 비용없이 정적으로 생성됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.