Thư viện ORM PHP tốt?


268

Có một thư viện ánh xạ quan hệ đối tượng tốt cho PHP không?

Tôi biết về PDO / ADO, nhưng dường như họ chỉ cung cấp sự trừu tượng về sự khác biệt giữa các nhà cung cấp cơ sở dữ liệu chứ không phải là ánh xạ thực tế giữa mô hình miền và mô hình quan hệ. Tôi đang tìm một thư viện PHP có chức năng tương tự như cách Hibernate làm cho Java và NHibernate làm cho .NET.

Câu trả lời:



103

Hãy thử RedBean , yêu cầu của nó:

  • Không có cấu hình
  • Không có cơ sở dữ liệu (nó tạo ra mọi thứ một cách nhanh chóng)
  • Không có mô hình
  • Vân vân.

Nó thậm chí còn thực hiện tất cả các khóa và giao dịch cho bạn và theo dõi hiệu suất trong nền. (Heck! Nó thậm chí không thu gom rác thải ....) tốt nhất của tất cả các ... bạn không phải viết một đơn ... dòng mã ... Chúa Giêsu này , lớp ORM , cứu tôi ass!


9
redbean đang xử lý lớp trừu tượng cơ sở dữ liệu tốt nhất mà tôi từng làm việc với. không phải "một trong những điều tốt nhất" - tốt nhất
Nir Gavish

Rất đẹp tìm thấy. Tôi rất ấn tượng với ORM này để nói rằng ít nhất
Christopher Tarquini



3
+1 +1 +1 +! +! !!!! ... jesus Tôi đã đọc phần đầu tiên của tài liệu và nó khiến tôi cười nhạo độc tài, và tôi đang tải nó xuống!
KJW

45

Chỉ có hai cái tốt: Học thuyếtPropel . Chúng tôi ủng hộ Học thuyết và nó hoạt động tốt với Symfony . Tuy nhiên, nếu bạn đang tìm kiếm hỗ trợ cơ sở dữ liệu ngoài những cái chính, bạn sẽ phải viết mã của riêng mình.


Propel là khá tốt theo tiêu chuẩn php. Nó tạo ra mã khá sạch sẽ thân thiện với IDE với getters và setters và một hệ thống trừu tượng tiêu chí rất sạch cho các truy vấn.
0x6A75616E

Vì câu hỏi này được liên kết xung quanh SO khá nhiều, tôi muốn chỉ ra rằng Propel là một dự án đã ngừng hoạt động vào năm 2020. Khả năng tương thích PHP7 chưa bao giờ được thực hiện. Vì vậy, chọn Propel làm ORM cho một dự án phần mềm mới vào năm 2020 không phải là một ý tưởng hay.
mrodo

34

Axon ORM là một phần của Khung không béo - nó có tính năng lập bản đồ đang hoạt động. Không có máy tạo mã. Không có tệp cấu hình XML / YAML ngu ngốc . Nó đọc lược đồ cơ sở dữ liệu trực tiếp từ phần phụ trợ, vì vậy trong hầu hết các hoạt động CRUD, bạn thậm chí không phải mở rộng một mô hình cơ sở. Nó hoạt động với tất cả các công cụ cơ sở dữ liệu chính được hỗ trợ bởi PDO : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreQuery , v.v.

/* 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();

Trên hết, lớp truy cập dữ liệu SQL bổ trợ và đi kèm chỉ nhẹ như khung: 14 KB (Axon) + 6 KB (SQLdb). Fat-Free chỉ là 55 KB.


15
Nó luôn làm tôi lo lắng khi tôi thấy một cái gì đó giống như $product->load('product_id=123')trong một ví dụ.
Znarkus

9
đối với hoang tưởng, cú pháp thay thế là$product->load(array('product_id=:id',array(':id'=>123)));
bcosca

4
Fat-Free cũng có các
ORM NoQuery

28

Tôi đã tự mình phát triển Pork.dbObject. (Một triển khai ORM PHP và Active Record đơn giản) Lý do chính là tôi thấy hầu hết các ORM quá nặng.

Ý nghĩ chính của Pork.dbObejct là nhẹ và đơn giản để thiết lập. Không có nhiều tệp XML, chỉ có một hàm gọi trong hàm tạo để liên kết nó và addRelation hoặc addCustomRelation để xác định mối quan hệ với dbObject khác.

Hãy xem: Pork.dbObject


1
Tôi đã tìm kiếm một triển khai PHP ORM nhẹ ngày hôm nay và tìm thấy Pork.dbObject nhờ vào bài đăng này. Nó hoạt động rất tốt! +1
E Dominique

6
Duude! Điều này khá thú vị. Tôi thấy rằng bản cập nhật mới nhất đã xảy ra ở đâu đó trong '09. Điều này vẫn còn được duy trì? Nếu không ... tôi chỉ có thể hồi sinh nó :)
VladFr

22

Thử học thuyết2 . Đây có lẽ là công cụ ORM mạnh nhất cho PHP. Tôi đang đề cập nó tách biệt với Học thuyết 1, vì đó là một phần mềm hoàn toàn khác. Nó đã được viết lại từ đầu, vẫn đang trong giai đoạn thử nghiệm, nhưng giờ nó đã có thể sử dụng và phát triển.

Đó là một ORM rất phức tạp, nhưng được thiết kế tốt. Rất nhiều phép thuật từ Học thuyết gốc 1 đã biến mất. Nó cung cấp một giải pháp hoàn chỉnh và bạn có thể viết ORM của riêng bạn lên trên Doctrine2 hoặc chỉ sử dụng một trong các lớp của nó .


Vấn đề duy nhất tôi có thể nghĩ đến với Doctrine2 là nó phụ thuộc vào PHP 5.3 trở lên.
jblue

8
@jblue: Đây không phải là vấn đề, đó là một tính năng ;-). Các thư viện lớn như Doctrine cần không gian tên.
Tom Pažourek

Rất nhiều phép thuật từ Học thuyết gốc 1 đã biến mất. - Điều này là tích cực?
Olivier 'Ölbaum' Scherler

13

Tôi mới bắt đầu với Kohana và có vẻ như gần nhất với Ruby on Rails mà không cần gọi tất cả sự phức tạp của nhiều tệp cấu hình như với Propel .


Tôi cũng đồng ý rằng Kohana là khung tương tự như RoR trong thế giới PHP. Tất cả những gì nó thiếu là giàn giáo, và với sự hỗ trợ của CLI trong KO3, vấn đề chỉ là ai đó xắn tay áo lên và làm điều đó.
Phillip Whelan

12

Kiểm tra ORM Outlet . Nó đơn giản hơn Propel và Doctrine và nó hoạt động tương tự như Hibernate, chỉ mang nhiều cảm giác của PHP hơn.


3
Tôi đã thử điều này. Tôi đã phải xác định các thuộc tính đối tượng giống nhau ở 3 vị trí - lược đồ cấu hình, mô hình và cơ sở dữ liệu. Đó là rất nhiều công việc để thực hiện IMM ORM.
mixdev

Ổ cắm rất nặng cấu hình.
Lotus Notes

Tôi đã thử điều này (1.0 RC1) và nó rất có lỗi ngay cả trong chức năng cốt lõi. Và vâng, có rất nhiều cấu hình để viết. Tôi không khuyên bạn nên nó.
Szymon Wygnański

11

Tôi thực sự thích Propel , ở đây bạn có thể có một cái nhìn tổng quan, tài liệu khá tốt và bạn có thể lấy nó thông qua PEAR hoặc SVN.

Bạn chỉ cần cài đặt PHP5 đang hoạt động và Phing để bắt đầu tạo các lớp.


Propel cũng có thể 'kỹ sư đảo ngược' một lược đồ cơ sở dữ liệu hiện có - tạo các đối tượng PHP từ việc đọc lược đồ cơ sở dữ liệu.
David Goodwin



6

Đưa ra một shot cho dORM, một trình ánh xạ quan hệ đối tượng cho PHP 5 . Nó hỗ trợ tất cả các loại mối quan hệ (1 đến 1), (1 đến nhiều), (nhiều-nhiều) và các loại dữ liệu. Nó hoàn toàn không phô trương: không yêu cầu tạo mã hoặc mở rộng lớp. Theo tôi nó vượt trội hơn bất kỳ ORM nào ngoài kia, bao gồm cả Học thuyết và Tuyên truyền. Tuy nhiên, nó vẫn đang trong giai đoạn thử nghiệm và có thể thay đổi đáng kể trong vài tháng tới. http://www.getdorm.com

Nó cũng có một đường cong học tập rất nhỏ. Ba phương pháp chính bạn sẽ sử dụng là:

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

4

Tôi hiện đang làm việc trên phpDataMapper , đây là một ORM được thiết kế để có cú pháp đơn giản như dự án Datamapper của Ruby. Nó vẫn còn trong giai đoạn đầu phát triển, nhưng nó hoạt động rất tốt.


4

Tôi đã có những trải nghiệm tuyệt vời với Idiorm và Paris . Idiorm là một thư viện ORM nhỏ, đơn giản. Paris là một triển khai Active Record đơn giản không kém được xây dựng trên Idiorm. Nó dành cho PHP 5.2+ với PDO. Thật hoàn hảo nếu bạn muốn một cái gì đó đơn giản mà bạn có thể thả vào một ứng dụng hiện có.


4

Vâng, tôi đã làm việc với nó một thời gian. Flourishlib là tuyệt vời, nhưng ORM vẫn còn một số việc phải làm. Làm việc với các bảng tham gia có các thuộc tính bổ sung hoặc khóa ngoại, tạo các đối tượng mới có thể hơi tẻ nhạt. Làm việc với các mô hình đơn giản là một cách dễ dàng. Hãy xem Repose ORM hoặc Outlet để tìm ORM thay thế cho PHP.
Michael

3

Cho đến khi phiên bản PHP 5.3 không mong muốn có một ORM tốt. Đó là một giới hạn OO của PHP.


Vậy làm thế nào PHP 5.3 sẽ giúp ai đó viết một ORM tốt hơn? Tôi không thấy bất kỳ lý do.
Ionuț G. Stan

8
lý do chính là sự ra đời của ràng buộc tĩnh muộn (từ khóa "tĩnh"). đọc về nó trên blog.felho.hu/ từ
knoopx

2
ORM không thực sự cần các biến tĩnh, chúng có thể được thiết kế tốt chỉ sử dụng các biến thể hiện.
Tom Pažourek

Đúng, ràng buộc tĩnh muộn là lý do tôi có thể nhận được mỗi phiên bản ORM của ORM của riêng mình quá thấp . Trước khi ràng buộc tĩnh muộn, nó là lãng phí như hầu hết những người khác.
Xeoncross

3

Bạn tôi, Kiên và tôi đã cải tiến phiên bản ORM trước đó mà anh ấy đã viết trước PHP 5.3. Về cơ bản, chúng tôi đã chuyển qua Bản ghi hoạt động của Ruby on Rails sang PHP. Nó vẫn còn thiếu một số tính năng chính mà chúng tôi muốn như giao dịch, hỗ trợ khóa chính tổng hợp, thêm một vài bộ điều hợp (chỉ có MySQL và SQLite 3 hoạt động ngay bây giờ). Nhưng, chúng tôi rất gần để hoàn thiện công cụ này. Bạn có thể xem PHP ActiveRecord với PHP 5.3 .


3

Hãy thử PHP ADOdb.

Tôi không thể nói nó là tốt nhất, vì tôi đã không sử dụng những người khác. Nhưng nó nhanh, nó hỗ trợ Memcached và bộ nhớ đệm.

Và nó nhanh hơn so với DB / Chọn của Zend Framework .


2
adodb cho vay nhiều hơn với hương vị Thin Model / Fat Controller, thường không phải là một điều tốt.
jblue

ADOdb có ORM (nhưng không chỉ là ORM). Nói chung, đây là một giải pháp thực sự tuyệt vời, nó hoạt động tốt hơn nhiều so với Zend dành cho DB (cũng như chậm hơn ADOdb, Zend DB chỉ hỗ trợ THAM GIA hạn chế), nó hỗ trợ tự động thoát với tham số hóa (không giống như Doctrine) nhiều phụ trợ DB khác nhau và có thiết kế bộ nhớ đệm mở rộng đẹp với tích hợp memcache siêu dễ dàng. Tôi không nghĩ chính xác khi nói rằng nó tự cho mình thực hiện "Mô hình mỏng / Bộ điều khiển chất béo" (bạn có thể làm điều đó hoặc không, nhưng thiết kế của ADOdb không ủng hộ cách này hay cách khác).
Iain Collins

3

Có một cái nhìn về ORAP LEAP cho Kohana . Nó hoạt động với một loạt các cơ sở dữ liệu, bao gồm cả DB2 , Drijection , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreQuerySQLite . Với chức năng tự động tải đơn giản, nó có thể hoạt động với hầu hết mọi khung công tác PHP. Mã nguồn có trên GitHub tại https://github.com/spadefoot/kohana-orm-leap . Bạn có thể kiểm tra hướng dẫn của LEAP trực tuyến.

Thư viện ORM hoạt động với các khóa chính không nguyên và khóa tổng hợp. Các kết nối được quản lý thông qua nhóm kết nối cơ sở dữ liệu và nó hoạt động với các truy vấn SQL thô. ORM thậm chí còn có trình xây dựng truy vấn giúp xây dựng các câu lệnh SQL siêu đơn giản.


2

Bạn có thể kiểm tra Repose nếu bạn cảm thấy phiêu lưu. Giống như Outlet , nó được mô phỏng theo Hibernate .

Vẫn còn rất sớm trong quá trình phát triển, nhưng cho đến nay, hạn chế duy nhất đối với mô hình miền là các lớp không được đánh dấu cuối cùng và các thuộc tính không được đánh dấu là riêng tư. Khi tôi vào vùng đất của PHP> = 5.3, tôi cũng sẽ cố gắng thực hiện hỗ trợ cho các thuộc tính riêng tư.


2

Nếu bạn đang tìm kiếm một ORM thực hiện mô hình Data Mapper thay vì Active Record cụ thể, thì tôi thực sự khuyên bạn nên xem GacelaPHP .

Các tính năng của Gacela:

  • Ánh xạ dữ liệu
  • Ánh xạ khóa ngoại
  • Lập bản đồ hiệp hội
  • Ánh xạ phụ thuộc
  • Kế thừa bàn bê tông
  • Đối tượng truy vấn
  • Ánh xạ siêu dữ liệu
  • Tải nhanh và háo hức
  • Hỗ trợ đầy đủ Memcached

Các giải pháp ORM khác quá cồng kềnh hoặc có những hạn chế nặng nề khi phát triển bất cứ điều gì phức tạp từ xa. Gacela giải quyết các hạn chế của cách tiếp cận bản ghi hoạt động bằng cách triển khai Mẫu ánh xạ dữ liệu trong khi giữ mức phình to ở mức tối thiểu bằng cách sử dụng PDO cho tất cả các tương tác với cơ sở dữ liệu và Memcached.


2

MicroMVC có ORM 13 KB chỉ dựa trên lớp cơ sở dữ liệu 8 KB . Nó cũng trả về tất cả các kết quả dưới dạng các đối tượng ORM và sử dụng liên kết tĩnh muộn để tránh nhúng thông tin về bảng và dữ liệu meta của đối tượng hiện tại vào từng đối tượng. Điều này dẫn đến chi phí ORM rẻ nhất hiện có.

Nó hoạt động với MySQL , PostgreSQLSQLite .


2

ORM Brazil: http://www.hufersil.com.br/lumine . Nó hoạt động với PHP 5.2+. Theo tôi, đó là sự lựa chọn tốt nhất cho người Bồ Đào Nha và Brazil, bởi vì nó có tài liệu dễ hiểu và rất nhiều ví dụ để tải xuống.


2

Bộ công cụ Agile có triển khai ORM / ActiveRecord và SQL động riêng của nó .

Giới thiệu: http://agiletoolkit.org/intro/1

Cú pháp (Bản ghi hoạt động):

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

Cú pháp (SQL động):

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

Mặc dù SQL động và Bản ghi hoạt động / ORM có thể sử dụng trực tiếp, Bộ công cụ Agile tích hợp thêm chúng với Giao diện người dùng và Giao diện người dùng jQuery . Điều này tương tự với JSF nhưng được viết bằng PHP thuần túy.

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

Điều này sẽ hiển thị AJAXified CRUD với mô hình Nhân viên.


2

Công chứng viên

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";
}

2

Khuôn mặt PHP ORM Để mở rộng PDO. Xem Khung công tác PHP .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();

1. Trang web là Thổ Nhĩ Kỳ; 2. Mã của bạn không có gì khác với mã bạn sẽ sử dụng, ví dụ như Học thuyết.
Pellmeister


1

Một ORM mã nguồn mở tuyệt vời khác mà chúng tôi sử dụng là PHPSmartDb . Nó ổn định và làm cho mã của bạn an toàn và sạch sẽ hơn. Chức năng cơ sở dữ liệu trong đó là bàn tay dễ sử dụng nhất mà tôi từng sử dụng với PHP 5.3.


1

Học thuyết có lẽ là đặt cược tốt nhất của bạn. Trước học thuyết, DB_DataObject về cơ bản là tiện ích duy nhất khác được mở nguồn.


1

Nếu bạn đang tìm kiếm một ORM, như Hibernate , bạn nên xem PMO .

Nó có thể được tích hợp dễ dàng trong một kiến trúc SOA (chỉ có một cụm dịch vụ web để phát triển).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.