1

Temat: Problem z ograniczaniem ilości złączeń tabel w paginacji

Mam problem z ograniczeniem "głębokości" tabel z jakiej wybierane są dane podczas paginacji.
Działam na następującym zestawie:

Tag <--habtm--> Note

Warunki w paginacji wyglądają tak:

$this->paginate = array(
        'Tag' =>array(
                'recursive' => 1,
                'conditions' => array(
                        'Tag.id' => $id
                ),
                'fields' => array(
                        'Tag.id',
                        'Tag.tag',
                ),
                'contain' => array(
                        'Note' => array(
                                'order' => 'Note.created DESC',
                                'fields' => array('Note.id', 'Note.created'),
                        )
                )
        )      
);

$notes = $this->paginate('Tag');

Wyniki jest w takiej postaci:

Array
(
    [0] => Array
        (
            [Tag] => Array
                (
                    [id] => 3
                    [tag] => praca
                )

            [Note] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [created] => 2010-04-15 07:32:38
                            [NotesTag] => Array
                                (
                                    [id] => 3
                                    [note_id] => 2
                                    [tag_id] => 3
                                )

                        )

                    [1] => Array
                        (
                            [id] => 1
                            [created] => 2010-04-14 14:40:29
                            [NotesTag] => Array
                                (
                                    [id] => 1
                                    [note_id] => 1
                                    [tag_id] => 3
                                )

                        )

                )

        )

)

Problemem jest to, że razem z rekoradami tabeli Note wybierane są dane z tabeli habtm NotesTag. Kombinowałem z $recursive - na poziomie 0 wybierają tylko dane Tag a na 1 wszystko tak jak widać wyżej.

Zastanawiam się nad tym już dobry dzień i skończyły mi się pomysły.

2

Odp: Problem z ograniczaniem ilości złączeń tabel w paginacji

spróbuj:

                'contain' => array(
                        'Note' => array(
                                'order' => 'Note.created DESC',
                                'fields' => array('Note.id', 'Note.created'),
                                'contain' => array()
                        )
                )

3

Odp: Problem z ograniczaniem ilości złączeń tabel w paginacji

Niestety to nie przejdzie. Contain można użyć tylko jeden raz w warunkach przy głównym modelu, po którym wyszukuję (próbowałem tego rozwiązania smile). Zastanawiam się właśnie, czy przypadkiem nie jest tak, że jedynym sposobem będzie pisanie zapytania z palca?

Przy dopinaniu ContainableBehaviora do modelu jest możliwość ustawienia parametru recursive, ale działa to tak samo jak przy wpisywaniu w warunkach paginacji - wyświetla wszystko albo nic.

Ostatnio edytowany przez zoltan (2010-04-15 12:58:00)

4

Odp: Problem z ograniczaniem ilości złączeń tabel w paginacji

No tak, faktycznie z tym contain to mnie fantazja poniosła.

A mogę zapytać, czemu te dane Ci przeszkadzają? Bo nie wpływają one na rozmiar zapytania, ponieważ tak czy siak musi być wykonany join z tabelą pośrednią.

Czy Twoja tabela pośrednia przechowuje jakieś dodatkowe dane, czy tylko klucze? Jeśli tylko klucze, to czy masz dla niej stworzony model i przy relacji Note habtm Tag masz parametr "with"?

5

Odp: Problem z ograniczaniem ilości złączeń tabel w paginacji

Twoja wypowiedz zwróciła moja uwagę na jedną rzecz. Rzeczywiście moja tabela notes_tags zawiera dodatkowe pole - id - oprócz kluczy z łączonych tablic. Musiałem wstawić je z rozpędu podczas projektowania bazy. Po usunięciu orm zwraca wynik taki, jakiego się spodziewałem. Dzięki za pomoc!

Te dane nie wpływają na rozmiar zapytania, ale pewnie mają wpływ na czas komunikację serwer www - baza danych. Oczywiście przy małych projektach nie ma to większego znaczenia. Zastanawiałem się natomiast co by było, gdyby tabela łącząca trzymała kilka - kilkanaście pól z danymi. No i najbardziej prozaiczny powód mojego zainteresowania tym tematem: fajnie by było mieć pełną kontrolę nad tym co jest wyciągane.

6

Odp: Problem z ograniczaniem ilości złączeń tabel w paginacji

z tego co wiem, w zlaczeniu HABTM nie wywalisz "doklejenia" NotesTag..
wiec kombinowanie z contain, nic nie da..