PHP ORMs: หลักคำสอนเทียบกับขับเคลื่อน


126

ฉันกำลังเริ่มโปรเจ็กต์ใหม่ด้วยsymfonyซึ่งรวมเข้ากับDoctrine and Propelได้อย่างง่ายดายแต่แน่นอนว่าฉันต้องเลือก .... ฉันสงสัยว่าคนที่มีประสบการณ์มากกว่านั้นมีข้อดีและ / หรือข้อเสียทั่วไปในการไปด้วยหรือไม่ ทั้งสองอย่างนี้?

ขอบคุณมาก.

แก้ไข: ขอบคุณสำหรับคำตอบทั้งหมดสิ่งที่มีประโยชน์ ไม่มีคำตอบที่ถูกต้องอย่างแท้จริงสำหรับคำถามนี้ดังนั้นฉันจะทำเครื่องหมายว่าอนุมัติแล้วคำถามที่ได้รับความนิยมสูงสุด


5
พวกคุณมีคำตอบที่อัปเดตหรือไม่? เห็นว่าวิธีนี้ล้าสมัย
Qiniso

คำตอบ:


76

ฉันจะไปกับ Doctrine สำหรับฉันแล้วดูเหมือนว่าจะเป็นโครงการที่มีการใช้งานมากกว่าและเป็น ORM เริ่มต้นสำหรับ symfony จึงได้รับการสนับสนุนที่ดีกว่า (แม้ว่า ORM อย่างเป็นทางการจะถือว่าเท่ากันก็ตาม)

นอกจากนี้ฉันชอบวิธีที่คุณทำงานกับแบบสอบถาม (DQL แทน Criteria):

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

(การใช้หลักคำสอนง่ายกว่ามากสำหรับฉัน)

นอกจากนี้ฉันชอบวิธีจัดการความสัมพันธ์ในหลักคำสอนมากกว่า

ฉันคิดว่าหน้านี้จากเอกสารหลักคำสอนควรค่าแก่การอ่าน: http://www.doctrine-project.org/documentation/manual/1_2/th/introduction:doctrine-explained

สรุป: ถ้าฉันกำลังเริ่มโครงการใหม่หรือต้องเลือกระหว่างการเรียนรู้หลักคำสอนกับการขับเคลื่อนฉันจะไปเรียนหลักคำสอนทุกวัน


42
ใน Propel 1.5 แบบสอบถามนี้สามารถเขียนเป็น Example_Query :: create () -> joinWith ('FooBar') -> filterId (20) -> find () (หรือ findPK (20) หลัง joinWith ถ้า Id เป็นหลักของคุณ สำคัญ). อย่างที่คุณเห็นต้องใช้ไวยากรณ์ที่ดีจาก Doctrine และเพิ่มอีกเล็กน้อย รุ่นนี้มีแผนจะวางจำหน่ายในช่วงปลายไตรมาสที่ 1 ปี 2010 แต่คุณสามารถทดสอบได้ในโครงการ Symfony ของคุณ
ม.ค. Fabry

การป้อนข้อมูลที่ดีฉันไม่รู้ว่า :-)
phidah

9
การปฏิบัติตามหลักคำสอนดูเหมือนจะซับซ้อนกว่าสำหรับฉันมาก รับ Entity จัดการได้รับพื้นที่เก็บข้อมูล ... นี้และที่
SoWhat

1
หลักคำสอนอยู่เหนือสิ่งที่ซับซ้อน ... สิ่งที่น่าสนใจก็คือหนทางที่จะไป
Geomorillo

40

ฉันมีความลำเอียงเนื่องจากฉันช่วย Propel รุ่นถัดไปเล็กน้อย แต่คุณต้องพิจารณาว่า Propel เป็น ORM แรกที่พร้อมใช้งานจากนั้นก็ล้าหลังเล็กน้อยเมื่อ Doctrine ถูกสร้างขึ้น แต่ตอนนี้มีการพัฒนาที่กระตือรือร้นอีกครั้ง Symfony 1.3 / 1.4 มาพร้อมกับ Propel 1.4 ซึ่งการเปรียบเทียบส่วนใหญ่หยุดที่ Propel 1.3 นอกจากนี้ Propel (1.5) รุ่นถัดไปจะมีการปรับปรุงมากมายโดยเฉพาะอย่างยิ่งในการสร้าง Criteria ของคุณ (ส่งผลให้คุณเขียนโค้ดน้อยลง)

ฉันชอบ Propel เพราะดูเหมือนว่าจะซับซ้อนน้อยกว่า Doctrine: โค้ดส่วนใหญ่อยู่ในคลาสที่สร้างขึ้นเพียงไม่กี่คลาสในขณะที่ Doctrine ได้แยกฟังก์ชันการทำงานออกเป็นหลายคลาส ฉันชอบที่จะมีความเข้าใจที่ดีเกี่ยวกับห้องสมุดที่ฉันใช้อยู่ (ไม่ใช่ "เวทมนตร์" มากเกินไป) แต่แน่นอนว่าฉันมีประสบการณ์กับ Propel มากกว่าดังนั้น Doctrine อาจจะไม่ซับซ้อนเบื้องหลัง บางคนบอกว่า Propel เร็วกว่า แต่คุณควรตรวจสอบด้วยตัวเองและพิจารณาว่าสิ่งนี้มีน้ำหนักมากกว่าความแตกต่างอื่น ๆ หรือไม่

บางทีคุณควรพิจารณาความพร้อมใช้งานของปลั๊กอิน Symfony สำหรับเฟรมเวิร์กต่างๆ ฉันเชื่อว่า Propel มีข้อได้เปรียบที่นี่ แต่ฉันไม่รู้ว่ามีปลั๊กอินที่แสดงอยู่กี่ตัวที่ยังคงเป็นเวอร์ชันล่าสุดของ Symfony


4
การปรับปรุงการสืบค้นใหม่ใน Propel 1.5 นั้นดีมาก
ทอม

23

มันขึ้นอยู่กับความชอบส่วนบุคคล ฉันใช้ Propel เพราะ (เหนือสิ่งอื่นใด) ฉันชอบความจริงที่ว่าทุกอย่างมีวิธี getter & setter ที่เป็นรูปธรรมของตัวเอง ในหลักคำสอนไม่เป็นเช่นนั้น

ขับเคลื่อน:

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

หลักคำสอน:

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

เหตุผลที่ฉันชอบมี getters & setters ก็คือฉันสามารถใส่ตรรกะได้ทุกประเภทถ้าฉันต้องการ แต่นั่นเป็นเพียงความชอบส่วนตัวของฉัน

ฉันควรเพิ่มด้วยว่าแม้ว่า Propel จะเคลื่อนไหวช้าในอดีต แต่ตอนนี้ก็อยู่ระหว่างการพัฒนาอีกครั้ง ได้เปิดตัวเวอร์ชันใหม่หลายรุ่นในช่วงไม่กี่เดือนที่ผ่านมา Propel เวอร์ชันล่าสุดมี "อินเทอร์เฟซการสืบค้นที่คล่องแคล่ว" คล้ายกับหลักคำสอนดังนั้นคุณจึงไม่ต้องใช้เกณฑ์อีกต่อไปหากคุณไม่ต้องการ


7
ในหลักคำสอนคุณสามารถแทนที่ setters และ getters สำหรับแต่ละคุณสมบัติและยังมีตรรกะที่กำหนดเอง (ดูdoctrine-project.org/documentation/manual/1_2/en/… - ค้นหา ATTR_AUTO_ACCESSOR_OVERRIDE เพื่อไปยังส่วนที่เกี่ยวข้อง)
Marek Karbarz

ดูเหมือนจะโอเค แต่คุณยังคงตั้งค่าคุณสมบัติโดยเรียก: $ x-> propname = 'abc'; นี่เป็นปัญหาเนื่องจากดูเหมือนว่าจะไม่รองรับการส่งผ่านพารามิเตอร์หลายตัว
lo_fye

20

ควรสังเกตว่าDoctrine 2อยู่ในระหว่างการพัฒนาที่ เผยแพร่ [ed] และฟังก์ชันเกือบจะแตกต่างจาก Doctrine 1 เวอร์ชันเสถียรในปัจจุบันโดยอาศัยรูปแบบ Data Mapper แทน Active Record และใช้ 'ตัวจัดการเอนทิตี' เพื่อจัดการกับการคงอยู่ ตรรกะ. เมื่อปล่อยออกมาจะมีความคล้ายคลึงกับ Hibernate ของ Java มากขึ้น (Doctrine 1 เหมือนกับ Rails 'ActiveRecord)

ฉันได้รับการพัฒนาด้วยการเปิดตัวอัลฟาของหลักคำสอน 2 และต้องบอกว่าเป็นหัวและไหล่เหนือหลักคำสอน 1 (เป็นเพียงความคิดเห็นของฉันและฉันไม่เคยใช้ Propel) มีโอกาสดีที่ชุมชนหลักคำสอนจะก้าวไปสู่ชุมชนนั้นเมื่อได้รับการเผยแพร่

ฉันขอแนะนำให้คุณลองดู Doctrine แต่ถ้าคุณชอบสไตล์ Active Record ที่ Propel และ Doctrine ใช้ตอนนี้คุณอาจต้องการเพียงแค่ใช้ Propel


4
Doctrine 2 เวอร์ชันเสถียรเพิ่งเปิดตัว doctrine-project.org/blog/doctrine2-released
Trevor Allred

5

การอ้างอิงทั้งสองค่อนข้างล้าสมัยดังนั้นคุณยังคงครอบคลุมถึงลักษณะทั่วไปบางประการโดยพื้นฐานแล้วคุณต้องประเมินประสบการณ์ของคุณกับกรอบงานเช่นนี้ข้อเสียเปรียบที่สำคัญของหลักคำสอนคือการไม่มี IDE ที่ให้คุณใส่รหัสอัตโนมัติในการขับเคลื่อนนั้นคือ ผู้ชนะการเรียนรู้เส้นโค้งการขับเคลื่อนและหลักคำสอนแตกต่างกันมากมันง่ายกว่าที่จะขับเคลื่อนถ้าโครงการของคุณจำเป็นต้องจัดการโมเดลข้อมูลที่ซับซ้อนใช้หลักคำสอนหากคุณต้องการทำงานอย่างรวดเร็วกับ ORM ซึ่งได้รับการบันทึกไว้อย่างดีที่สุดและค้นหาการสนับสนุนเพิ่มเติมใน Propel การใช้อินเทอร์เน็ตเป็นผู้ใหญ่มากขึ้นและฉันเชื่อว่าส่วนใหญ่ใช้

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


ในโลกแห่งสัญลักษณ์ดูเหมือนว่าหลักคำสอนจะถูกใช้มากที่สุดโดยเฉพาะอย่างยิ่งสำหรับโครงการใหม่ ๆ มีโครงการ sf 1.0 จำนวนมากที่ยังคงใช้ Propel เนื่องจาก Doctrine ไม่สามารถใช้งานร่วมกันได้จนถึง 1.1
phidah

5

ฉันขอแนะนำให้ใช้ propel 1.6 ซึ่งดีกว่าสำหรับฟังก์ชันเติมข้อความอัตโนมัติของ IDE


26
-1 การเติมข้อความอัตโนมัติของ IDE ไม่ควรเป็นเหตุผลของการเลือกทางเทคนิค
Clement Herreman

14
@ClementHerreman ผมเห็นด้วยก็ไม่ควรจะเกณฑ์ แต่ผมเชื่อว่าวิธีการที่มีประสิทธิผลหนึ่งสามารถอยู่กับเทคโนโลยีเฉพาะอย่างแน่นอนควรจะเหตุผลสำหรับการเลือก และด้วยความเคารพอย่างเต็มที่ฉันจึงไม่เห็นด้วยกับการลงคะแนนของคุณ ... ไม่ว่าคุณจะเห็นด้วยกับคำตอบก็ตามมันก็ไม่ "ผิด" (หรือเปล่า?) และมีประโยชน์บ้าง (เว้นแต่จะผิดในกรณีนี้ คุณควรระบุสิ่งนี้)
Sepster

2
IMO หากประสิทธิภาพการทำงานของคุณได้รับการปรับปรุงให้ดีขึ้นโดยการเติมข้อความอัตโนมัติแทนที่จะเป็นคุณภาพของซอฟต์แวร์ความสามารถในการใช้งานและความสม่ำเสมอจะมีบางอย่างที่แปลกประหลาดเกิดขึ้น ดูcodinghorror.com/blog/2009/01/… . แต่คุณพูดถูกในบางประเด็นคำตอบนี้ไม่ผิดแค่ไม่ดีพอบางทีก็ไม่ดีด้วยซ้ำ
Clement Herreman

1
@ClementHerreman ถ้าไม่เป็นประโยชน์ไม่ได้ใช้มันอีกต่อไป) 1
เอเอ็มดี

มีคำตอบที่เป็นปัจจุบันหรือไม่? นี่เป็นวิธีที่ล้าสมัย
Qiniso

2

ฉันไม่ใช่ผู้ใช้ PHP 5 ที่ไม่ใช่กรอบ ORM แต่นี่คือโพสต์เปรียบเทียบที่ดี (ในกรณีที่คุณยังไม่เห็น):

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

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

ทั้งคู่ชอบรวมกันต่อ Doctrine ในฐานะรุ่นใหม่ของ ORM สำหรับ Symfony


1
สำหรับบันทึกการเปรียบเทียบนี้ล้าสมัยโดยสิ้นเชิง Propel เวอร์ชันปัจจุบันใช้ PDO ใช้รองรับความสัมพันธ์แบบกลุ่มต่อกลุ่มและมีเอกสารที่ดีเยี่ยม สิ่งที่ควรพิจารณา: พวกเราบางคนชอบสไตล์คิวรีตัวสร้างเกณฑ์ verbose มากกว่าภาษาแบบสอบถามที่เป็นกรรมสิทธิ์เช่น DQL - มีการรองรับ IDE และเป็นคลาสดังนั้นคุณจึงสามารถขยายได้ ฉันยังคงพยายามเลือก แต่ฉันเห็นข้อดีมากมายสำหรับ Propel over Doctrine หากคุณไม่สนใจการสร้างโค้ดแบบคงที่และสามารถเห็นข้อดีของโค้ด PHP "จริง" ซึ่งต่างจากภาษาสืบค้นที่เป็นกรรมสิทธิ์ ซึ่งเป็นเพียงสตริงของ IDE
mindplay.dk

2

หลังจากใช้ทั้งสองอย่างเป็นเวลาหลายปีฉันชอบ Propel 2 to Doctrine เพียงแค่อิงตามวิธีที่คุณสร้างตรรกะการสืบค้นของคุณ หลักคำสอนมีความลึกซึ้งมากที่สุดเท่าที่จะทำได้และการจัดการหลาย ๆ ด้านของหลักคำสอนนั้นตรงกับระดับความลึกนั้น ขับเคลื่อนฉันรู้สึกว่ามีวิธีการสร้างและจัดการการโต้ตอบแบบสอบถามที่ลื่นไหลและขับเคลื่อนด้วยวัตถุมากขึ้น

สำหรับฉันสิ่งนี้ทำให้โค้ดน้อยลงในโมเดลและโครงสร้างเพิ่มเติมเกี่ยวกับวิธีที่ตรรกะสามารถ / จะถูกประมวลผล สิ่งนี้ส่งผลให้เพียงแค่สร้างการโต้ตอบจำนวนมากเป็นฟังก์ชันทั่วไป (หลังจากทั้งหมด 90% ของสิ่งที่คุณจะทำกับฐานข้อมูลเป็นเพียงการดำเนินการที่ผิดพลาดในระดับหนึ่ง)

ในท้ายที่สุดทั้งสองมีประสิทธิภาพจัดการได้และจะทำงานให้ลุล่วง โครงการส่วนตัวและความสนใจของฉันใช้ Propel ORM 2 และโครงการในอนาคตหากยังคงเขียนด้วย PHP จะไปเส้นทางนั้น

ฉันใช้ทั้งสองอย่างเป็นประจำทุกวันในช่วง 3-4 ปีที่ผ่านมา


1

ผมขอแนะนำให้ใช้DbFinder ปลั๊กอิน นี่เป็นปลั๊กอินที่มีประสิทธิภาพมากที่รองรับทั้งสองอย่างและค่อนข้างมีประสิทธิภาพ ฉันชอบใช้มันมากกว่าอย่างใดอย่างหนึ่ง


@ ไมค์: ขอบคุณไม่รู้เกี่ยวกับปลั๊กอิน แต่ดูเหมือนว่าจะรองรับได้ถึง Sf1.2 เท่านั้น ฉันลงเอยด้วยหลักคำสอนในที่สุดรู้สึกว่าเป็นทางเลือกที่ถูกต้องแม้ว่าการเขียน SQL โดยตรงจะเป็นสิ่งที่จำเป็นสำหรับสิ่งที่ซับซ้อนมากขึ้น
ทอม

-2

ถ้าฉันไม่ผิด ORM ทั้งสองจะใช้สคีมาที่ใช้ XML และการสร้างข้อกำหนดสคีมาเหล่านี้ก็ค่อนข้างยุ่งยาก หากคุณต้องการสคีมาง่ายๆที่ใช้ PHP พร้อมสไตล์ที่คล่องแคล่ว คุณสามารถลอง LazyRecord https://github.com/c9s/LazyRecordซึ่งรองรับการย้ายข้อมูลอัตโนมัติและตัวสร้างสคริปต์อัปเกรด / ดาวน์เกรด และไฟล์คลาสทั้งหมดถูกสร้างขึ้นแบบคงที่โดยไม่มีต้นทุนรันไทม์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.