poniedziałek, 1 września 2008

Struktura drzewa w Symfony

Na devzone (http://dev.mysql.com/tech-resources/articles/hierarchical-data.html) MySQLa znajduje się artykuł o tworzeniu hierarchicznych struktur danych. Popularnym zastosowaniem takiej struktury jest menu strony internetowej, gdzie mamy do czynienia z drzewem linków (kategorii).
W artykule omówione są dwa podejścia Adjacency List Model i Nested Set. Pierwsze doskonale sprawdza się w przypadku 2, no góra trzech zagnieżdżeć ale jest łatwiejsze do zaimplementowania. Nested Set sprawdza się gdy chcemy jednym zapytaniem pobrać całe drzewo lub całą ścieżkę.

Jeżeli chcemy skorzystać z Nested Net w projekcie opartym o symfony, należy w strukturze danych (schema.yml), ktore kolumny zawierają TREE_LEFT, TREE_RIGHT, TREE_SCOPE, np:

categories:
_attributes: { phpName: Category, treeMode: NestedSet}
id:          ~ #symfony default
lft:         { type: integer, required: true, 
nestedSetLeftKey: true, phpName: Left }
rgt:         { type: integer, required: true, 
nestedSetRightKey: true, phpName: Right }
level:       { type: integer, required: true }
name:        { type: varchar(100), required: true }
photo:       { type: varchar(255) }


Nested Set jest dostępny dopiero od ostatniej wersji propela 1.3. W symfony 1.1 musimy zainstalowac plugin Propel 1.3 z repozytorium http://svn.symfony-project.com/plugins/sfPropelPlugin/branches/1.3
Z moich dotychczasowych doświadczeń mogę powiedzieć, że rozwiązanie nie jest jeszcze w pełni stabilne. W przypadku modyfikacji, przenoszenia gałęzi czasem gubiona jest struktura.

Innym rozwiązaniem dla symfony jest plugin sfPropelActAsNestedSetBehaviorPlugin. Ten plugin zdaje się być w pełni stabilny. Z kolei nie bedzie w pełni działał pod Propelem 1.3.

Podsumowując, zarówno dla symfony 1.0, jak i dla symfony 1.1 polecam sfPropelActAsNestedSetBehaviorPlugin.