2011-12-14 12 views
10

Jestem całkiem nowy w Doctrine i zastanawiam się, jak skutecznie obliczyć liczbę powiązanych obiektów dla danego obiektu modelu.Jak skutecznie liczyć powiązane wiersze w modelu za pomocą Doctrine2

Przeczytałem here, że nie jest to świetny pomysł, aby użyć podmiotu zarządzającego w modelach, więc zastanawiam się, jak mogę zapytać bazy danych, aby dowiedzieć się bez leniwego ładowania wszystkich powiązanych modeli i robi count().

Tak naprawdę nie znalazłem jeszcze dobrej odpowiedzi, ale wygląda na to, że jest to całkiem podstawowa rzecz?

Na przykład

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

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

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

Odpowiedz

19

Doctrine 2 dostanie liczy dla ciebie automatycznie jako właściwości Stowarzyszenia są rzeczywiście obiekty Doktryna Kolekcja:

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

Jeśli zaznaczysz stowarzyszenie jako chętny, Doktryna załaduje pokoje za każdym razem, gdy pytasz o dom. Jeśli oznaczysz je jako leniwy (domyślny), Doctrine nie załaduje pokoi, dopóki nie uzyskasz dostępu do właściwości $this->rooms.

Od wersji Doctrine 2.1 można oznaczyć asocjacje jako dodatkowe leniwy. Oznacza to, że wywołanie $this->rooms->count() nie załaduje pokoi, to po prostu wyśle ​​zapytanie do bazy danych o numerze COUNT.

Można przeczytać o dodatkowych zbiorów leniwych tutaj: http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/extra-lazy-associations.html

+0

Ah ładny, będę to sprawdzić od razu. W rzeczywistości używam tylko Doctrine 2.0, więc prawdopodobnie będę musiał również zaktualizować mój kod. – chrismacp

+1

Właśnie rozpoznałem, że możesz bezpośrednio użyć count ($ house-> getRooms()). Spowoduje to prawidłowe dodanie pojedynczego zapytania COUNT. Zobacz także: http://stackoverflow.com/questions/15645911/doctrine-extra-lazy-load-doesnt-work-as-expected-with-count – webDEVILopers

+0

Jaki byłby najlepszy sposób dodania do tego GDZIE? tj. policzyć pokoje, w których pojemność> 2 lub podobne? Walcząc z tym. –

Powiązane problemy