2012-01-12 21 views
6

Tôi thực sự thích Bản ghi hoạt động của CodeIgniter và mức độ độc đáo của nó cho phép tất cả các truy vấn cơ sở dữ liệu cần thiết của tôi.Doctrine Thêm bản ghi hoạt động nào ở trên - CodeIgniter?

Nhưng tôi cũng đã đọc về ORM như Doctrine. Khi tôi đọc tài liệu của Doctrine, nó có vẻ không rõ ràng để sử dụng như Active Record, và tôi không thể thấy điều gì làm cho nó tốt hơn (nếu có).

Doctrine cho phép điều gì không thể thực hiện với Bản ghi đang hoạt động? Doctrine có thực hiện cùng một công việc nhanh hơn, dễ dàng hơn, tốt hơn không? Hay nó làm những thứ Active Record không thể làm được?

Tốt nhất là nếu mọi người có thể đăng ví dụ về các tác vụ hiển thị những gì chúng tôi đang nói đến.

Cảm ơn, Matthew

+0

Học thuyết là một ORM chính thức thực hiện mẫu bản ghi đang hoạt động. Lớp bản ghi hoạt động của CodeIgniter là một trình tạo truy vấn dựa trên phiên bản "sửa đổi" của mẫu. – birderic

+0

Hi birderic, Cảm ơn câu trả lời nhanh. Bạn có thể cho tôi một ví dụ mà điều này sẽ đi vào chơi? Chúng ta đang nói về những thứ như hoạt động của CRUD? – MatthewSchenker

+0

Tôi sẽ viết một câu trả lời dài hơn. Tôi không có kinh nghiệm với Doctrine nhưng tôi sẽ cố hết sức để so sánh cả hai. – birderic

Trả lời

9

thuyết là một ORM full-fledged mà thực hiện mô hình kỷ lục hoạt động. Lớp bản ghi hoạt động của CodeIgniter là trình tạo trình bao bọc/trình cơ sở dữ liệu truy vấn dựa trên phiên bản "đã sửa đổi" của mẫu.

Tuyên bố từ chối trách nhiệm: Tôi chưa bao giờ sử dụng Doctrine. Tôi sẽ cố gắng hết sức để minh họa sự khác biệt giữa việc thực hiện hồ sơ hoạt động của CodeIgniter và Doctrine, dựa trên sự hiểu biết của tôi.

Sử dụng lớp kỷ lục hoạt động CodeIgniter, bạn có thể thực hiện một mô hình như thế này:

class User_model extends CI_Model 
{ 

    public function get_user_by_username($username) 
    { 
     // Build query using active record methods 
     $this->db->where('username', $username); 
     $this->db->where('active', 1); 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->result(); 
    } 

    // ... 

} 

cơ bản Bạn đang xây dựng các truy vấn bằng cách sử dụng phương pháp kỷ lục hoạt động. Thật dễ dàng để xem cách thức mỗi phương thức (where(), get(), v.v.) ánh xạ tới SQL thô. Ưu điểm của việc sử dụng các phương thức ghi hoạt động như trái ngược với chỉ $this->db->query() là CodeIgniter biên dịch mỗi truy vấn dựa trên trình điều khiển cơ sở dữ liệu bạn đang sử dụng. Ngoài ra, việc triển khai bản ghi hoạt động của CodeIgniter không thực sự làm nhiều. Bất kỳ truy vấn nào bạn cần, bạn sẽ cần phải tạo. Tôi hy vọng tôi đã minh họa cách các phương thức ghi hoạt động tương tự như một trình tạo truy vấn.

Lưu ý rằng mã mẫu sau có thể không chính xác. Sử dụng Doctrine, bạn có thể có một mô hình như thế này:

/** @Entity */ 
class User 
{ 

    /** @Column(type="integer") */ 
    private $id; 

    /** @Column(length=50) */ 
    private $username; 

    // ... 

} 

Sau đó, sử dụng các mô hình và các chức năng ghi lại hoạt động liên kết, bạn sẽ làm điều gì đó như thế này:

// Instantiate object 
$user = new User(); 

// Set properties 
$user->username = 'some_username'; 

// Save object 
$user->save(); 

// Access properties 
echo $user->id; 

này chỉ là trầy xước bề mặt về những gì Doctrine có thể làm. Bạn có thể đặt giá trị mặc định cho thuộc tính hoặc chỉ định mối quan hệ giữa các bảng. Lưu ý cách tôi không viết bất kỳ SQL hoặc xây dựng truy vấn nào. Tôi chỉ cần thiết lập các thuộc tính của đối tượng và sau đó lưu nó. Giáo lý chăm sóc phần còn lại.

Lưu ý rằng Doctrine bao gồm trình tạo truy vấn của riêng nó, vì vậy theo cách nó ghi lại hoạt động của CodeIgniter, và nhiều hơn nữa.

Sử dụng Doctrine tương tự như triển khai thực hiện mẫu bản ghi hoạt động của CakePHP hoặc Ruby on Rails. Bạn có thể xem xét ở đó để có thêm thông tin chi tiết về mẫu. Ví dụ của CakePHP có thể dễ dàng tiêu hóa nếu bạn đến từ nền CodeIgniter.

Để trả lời một số câu hỏi khác của bạn, tôi không nghĩ có bất kỳ điều gì giúp Doctrine tốt hơn các phương pháp ghi lại hoạt động CodeIgniter. Nó có thể nâng cao hơn, nhưng cũng giống như bất kỳ thư viện nào khác, bạn muốn chọn công cụ tốt nhất cho công việc.Nếu bạn hài lòng với các phương thức ghi hoạt động của CodeIgniter và bạn không cần phải có ORM nâng cao, thì hãy bỏ qua nó.

+1

birderic, cảm ơn bạn đã trả lời câu hỏi này. Nó giúp tôi xem tôi đã làm gì sau đó. Tôi cũng đã nghiên cứu lớp cơ sở dữ liệu của Symfony, và nó có vẻ giống các phương thức CakePHP hơn. Tôi rất vui khi biết rằng cả hai phương pháp đều có thể đạt được các mục tiêu tổng thể giống nhau, mặc dù chúng đạt được mục tiêu khác nhau. – MatthewSchenker

+0

Doctrine 2.x không sử dụng bản ghi hoạt động. Nó sử dụng mô hình trình ánh xạ dữ liệu. –

18

Trước hết, những gì học thuyết đang nói gì vậy, 1 hoặc 2?
Có một sự khác biệt rất lớn. Điều duy nhất mà cả hai có điểm chung là chúng đều là ORM-s chính thức. Nếu không thì thực sự không có mối liên hệ nào giữa hai người.

Học thuyết 1 dựa trên ActiveRecords, Học thuyết 2 dựa trên Trình ánh xạ dữ liệu mẫu.
Cả hai đều có thể làm những điều tương tự, nhưng có một số khác biệt đáng kể giữa hai loại.

Nói chung dữ liệu mapper ít "nhà phát triển thân thiện", nhưng nên có hiệu suất tốt hơn. Tại sao? Trên thực tế nó là khá đơn giản. Với các bản ghi hoạt động, mỗi thực thể biết mọi thứ "xung quanh", quan hệ với các thực thể khác. Với trình ánh xạ dữ liệu, các thực thể là câm và nhẹ, có một thực thể trung tâm (EntityManager/UnitOfWork trong Doctrine2) xử lý tất cả ánh xạ quan hệ. Vì vậy, về mặt sử dụng bộ nhớ và hiệu suất Bộ lập bản đồ dữ liệu sẽ nhanh hơn.
Các Doctrine guys nói rằng Doctrine2 nhanh hơn Docstine1 ít nhất 50% (có những khác biệt khác nữa, không chỉ là mẫu thiết kế).

Nếu bạn cảm thấy lên cho nó, bạn thậm chí có thể thực hiện ActiveRecords qua Doctrine2 mapper dữ liệu. Nhìn vào đây blog post. Tôi đang sử dụng phương pháp này chỉ dành cho giai đoạn phát triển, để giữ ít mã nhất có thể. Khi nó được đưa vào sản xuất, tôi sẽ giết lớp ActiveRecords bổ sung và quay trở lại trình ánh xạ dữ liệu mặc định của Doctrine2.

Vì vậy, kết luận là bạn có thể làm mọi thứ với cả hai, nhưng trong cùng một cách bạn có thể nói rằng bạn có thể làm mọi thứ với SQL thô. Nếu bạn là một người mới bắt đầu trong thế giới ORM, tôi sẽ đề nghị đi với ActiveRecords, bởi vì nó là đơn giản và (thường) đòi hỏi ít mã hơn. Mặt khác, nếu bạn đang xây dựng một mô hình lớn, phức tạp, tôi nghĩ rằng người lập bản đồ dữ liệu là lựa chọn tốt hơn.

Có lẽ tôi đã nhận được điều gì sai, nhưng đây là cách tôi hiểu nó.

Đối với sự so sánh giữa CodeIgniters ActiveRecords và Doctrine (1 hoặc 2), tôi không thể thực sự nói, bởi vì tôi không bao giờ sử dụng CodeIgniter. Một điều tôi chắc chắn là, Doctrine có nhiều tính năng hơn ORM mặc định của CodeIgniters. Ví dụ: kết quả hydrat hóa, kế thừa (bảng đơn, bảng lớp), tìm nạp trước, tải chậm, tải thêm lười, mở rộng, hành vi, tối ưu hóa, proxy, xử lý datetime ... Đó là một ORM lớn và chính thức với rất nhiều các tính năng, trong khi trải nghiệm của tôi với bất kỳ "khung công tác ORM mặc định" nào là mục tiêu chính của họ là đơn giản nhất có thể, vì vậy một người mới có thể dễ dàng nhận được nó. Giáo lý là một con thú hùng mạnh, và chắc chắn có thể làm được nhiều thứ một cách hiệu quả và/hoặc hợp lý hơn so với việc xây dựng trong CodeIgniter ORM. Nhược điểm là, phải mất nhiều thời gian hơn để tìm hiểu và mã hóa, và nó là một thư viện khổng lồ, với hàng ngàn tệp, vì vậy chỉ để mọi thứ chạy thêm một số chi phí so với một giải pháp thay thế nhẹ hơn.

+0

ZolaKt, cảm ơn câu trả lời của bạn. Tôi đang nói về các phiên bản mới nhất của mọi thứ. Tôi thích những tính năng bổ sung mà bạn mô tả cho Doctrine. Nói chung, tôi thực sự thích CodeIgniter, nhưng tôi mới làm quen với các khung công tác nói chung. Dường như cách tiếp cận tốt nhất của tôi là làm chủ lớp Active Record của CodeIgniter, sau đó xem xét sử dụng Doctrine trong CodeIgniter tại một điểm sau này. – MatthewSchenker

+0

Đây hoàn toàn là chủ quan, nhưng nếu bạn đang có kế hoạch tìm hiểu một khuôn khổ hãy xem Kohana. Đó là do thiết kế linh hoạt hơn một chút với tích hợp các thư viện khác hơn CodeIgniter. Phiên bản mới nhất là tốt, nhưng như tôi đã nói đây là 2 dự án hoàn toàn khác nhau, trên hai mẫu khác nhau. Nếu bạn đang làm một dự án "nhỏ hơn" gắn bó với các bản ghi hoạt động mặc định ORM. Họ có thể làm gần như tất cả các Doctrine có thể, mặc dù một số thứ phải được thực hiện thủ công. Một điều tôi lưu ý, rất hiếm khi những ORM đó hỗ trợ sự thừa kế, vì vậy nếu bạn cần nó tìm một cái gì đó có thể làm điều đó, như Doctrine. – ZolaKt

+0

Một lời khuyên khác. Làm một số đọc và thử trước khi bạn quyết định nên sử dụng. Đừng giới hạn bản thân với CodeIgniters ORM, có một vài bản ghi ORM hoạt động tốt của PHP. Tất cả về mô hình. Nếu bạn biết một bản ghi hoạt động ORM, bạn sẽ biết người khác trong thời gian không. Cùng đi cho người lập bản đồ dữ liệu. Ví dụ nếu bạn biết Doctrine bạn sẽ biết (N) Hibernate. Nếu bạn quyết định rằng bạn thích bản ghi hoạt động trên trình ánh xạ dữ liệu, bạn cũng có thể xem Propel. Một ORM chính thức dựa trên các bản ghi hoạt động. Từ những gì tôi đã thấy chỉ có PHP thay thế cho Doctrine nếu bạn muốn tất cả các tính năng "ưa thích" – ZolaKt

Các vấn đề liên quan