2011-09-23 27 views
5

Tôi là một .NET chuyển đổi sang PHP và cho đến nay có một thời gian tốt với quá trình chuyển đổi. Tôi đang sử dụng giáo lý 1.2 như ORM của tôi và có các mô hình của tôi làm việc và tất cả mọi thứ được kết nối tốt. Tuy nhiên, vấn đề tôi đang tìm kiếm bây giờ là các đối tượng đầu ra là rất lớn. Tôi có một bảng khá đơn giản được gọi là USERS - có thể có 8 cột và FK đến 4 hoặc 5 bảng khác. Tôi đang sử dụng mã bên dưới để hydrate đối tượng NGƯỜI DÙNG của tôi:Các đối tượng giáo lý là HUGE

$q = Doctrine_Query::create() 
->select('u.*') 
->from('USERS u') 
->where('u.VANITY_URL = ?',$Url_Frag); 

$users = $q->execute(); 

print_r($users); 

Tôi thấy đối tượng ngậm nước với dữ liệu của tôi rất tốt. Tuy nhiên, nó cũng đi kèm với những gì trông giống như một loạt các dữ liệu meta mà tôi rõ ràng là không cần. Nhìn chung, đối tượng dài hơn 5000 dòng! Tôi chắc chắn có một chuyển đổi rõ ràng ở đâu đó mà về cơ bản nói "chỉ phát ra dữ liệu như vậy" nhưng tôi không thể tìm thấy nó trong sách hướng dẫn học thuyết.

Suy nghĩ?

+0

Sử dụng print_r ($ users-> toArray()); btw, có một đối tượng của 5000 dòng không phải là một vấn đề gì cả. – Zeljko

Trả lời

1

Bạn có một số tùy chọn. Một là chuyển sang doctrine2: nó có kiểu dáng đẹp, không có bất kỳ phép thuật nào của doctrine1.

Thứ hai là thay đổi chế độ hydrat hóa của bạn. Bạn không thể thực sự tinh chỉnh mô hình học thuyết hoặc chất béo của một đối tượng mà không thay đổi logic doctrine_record. Vì vậy, đây có thể làm việc:

$q = Doctrine_Query::create() 
->select('u.*') 
->from('USERS u') 
->where('u.VANITY_URL = ?',$Url_Frag) 
->setHydrationMode(Doctrine::HYDRATE_ARRAY); 
$users = $q->execute(); 

Print_r'ing các đối tượng này sẽ hughe, vì có rất nhiều đối tượng lồng nhau trong mạng thuyết lớp (một số đối tượng có một chút của "thần phức tạp" trong đó).

Nhiều tài liệu có thể được tìm thấy ở đây: http://www.doctrine-project.org/documentation/manual/1_2/pl/data-hydrators:core-hydration-methods

1

nếu tôi không nhầm, có một số tài liệu tham khảo vòng tròn trong Doctrine1.2 thực thể, vì vậy print_r hoặc var_dump trên chúng không phải là một ý tưởng tốt. Trên thực tế, nếu bạn không có thứ gì đó như Xdebug giới hạn độ sâu đệ quy, bạn sẽ không bao giờ nhận được kết quả đầu ra cho trình duyệt.

Nếu bạn thực sự quan tâm đến mức tiêu thụ bộ nhớ, hãy sử dụng chức năng memory_get_usage để kiểm tra dấu chân bộ nhớ trước và sau khi hydrat hóa.

7

Trong Doctrine2, có một dump() phương pháp có sẵn tại địa chỉ:

\Doctrine\Common\Util\Debug::dump($var, $maxDepth) 

Nó làm một công việc tương tự như print_rvar_dump, nhưng ẩn chứa tất cả các dữ liệu liên quan đến học thuyết.

Có thể có điều gì đó tương tự với Doctrine 1.x?

6

Đối tượng và bộ sưu tập đối tượng 1.2 của Doctrine có một phương thức có tên là "toArray". Vì vậy, bạn có thể làm:

print_r($users->toArray()); 
Các vấn đề liên quan