2011-12-14 25 views
10

Tôi khá mới với Doctrine và tự hỏi làm thế nào để tính hiệu quả số lượng các đối tượng liên quan có đối tượng cụ thể.Cách đếm hiệu quả các hàng liên quan trong một mô hình bằng Doctrine2

Tôi đọc here rằng không nên sử dụng trình quản lý thực thể trong các mô hình vì vậy tôi tự hỏi làm thế nào tôi truy vấn cơ sở dữ liệu để tìm hiểu mà không cần tải tất cả các mô hình liên quan và thực hiện đếm().

Tôi chưa thực sự tìm thấy câu trả lời hay, nhưng có vẻ như đây là một điều khá cơ bản?

Ví dụ

class House 
{ 
    /** 
    * @var Room 
    */ 
    protected $rooms 

    public function getRoomCount() 
    { 
     // Cant use entity manager here? 
    } 
} 

class Room 
{ 
    // Shed loads of stuff in here 
} 

Trả lời

19

thuyết 2 sẽ được tính cho bạn tự động như tài sản gắn thực sự đối tượng thuyết sưu tập:

public function getRoomCount() 
{ 
    return $this->rooms->count(); 
} 

Nếu bạn đánh dấu các hiệp hội như háo hức, Học thuyết sẽ được tải phòng bất cứ khi nào bạn truy vấn cho các thực thể nhà. Nếu bạn đánh dấu chúng là lười (mặc định), Doctrine sẽ không tải các phòng cho đến khi bạn thực sự truy cập thuộc tính $this->rooms.

Kể từ Doctrine 2.1, bạn có thể đánh dấu các liên kết là lười biếng hơn. Điều này có nghĩa rằng việc gọi $this->rooms->count() sẽ không tải các phòng, nó sẽ chỉ phát hành một truy vấn COUNT tới cơ sở dữ liệu.

Bạn có thể đọc thêm về các bộ sưu tập lười biếng tại đây: http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/extra-lazy-associations.html

+0

Ah, tôi sẽ kiểm tra ngay lập tức. Tôi thực sự chỉ sử dụng Doctrine 2.0 cũng như vậy có lẽ sẽ cần phải cập nhật mã của tôi là tốt. – chrismacp

+1

Tôi chỉ nhận ra rằng bạn có thể trực tiếp sử dụng số ($ house-> getRooms()). Điều này sẽ thêm một COUNT truy vấn đơn giản. Xem thêm: http://stackoverflow.com/questions/15645911/doctrine-extra-lazy-load-doesnt-work-as-expected-with-count – webDEVILopers

+0

Cách tốt nhất để thêm WHERE vào đây là gì? tức là, các phòng có dung lượng> 2 hoặc tương tự? Đấu tranh về điều này. –

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