Clicky

Skocz do zawartości


Zdjęcie
- - - - -

[K2] Rozszerzenie ORM_Iterator o przydatne funkcje

Brak odpowiedzi do tego tematu

  • Zaloguj się, aby dodać odpowiedź

#1 suda

suda

    Początkujący

  • Użytkownik
  • Pip
  • 12 postów
  • Skąd:Warszawa

Napisano 17 marzec 2008 - 16:12

Na początek opiszę gdzie miałem problem a potem moje rozwiązanie :)

Otóż mam takie tabele:
-blogs
-posts
-posts_stats
-posts_tags
w których relacje są następujące:
blogs has_many => posts
posts has_one => posts_stats
posts has_many => posts_tags
Problem miałem, gdy chciałem pobrać do aktualnej strony, wszystkie powyższe tabele. Aby pobrać wszystkie statystyki/tagi posta, wymagało by iteracji posts i za każdym razem find_related_posts_stats()/find_related_posts_tags() co by zajechało bazę danych. Nadpisałem więc klasę ORM, tak aby mi odpowiadała (źródło znajduje się w załączniku). Aby korzystać z tej biblioteki, należy zmienić modele, tak aby rozszerzały MY_ORM zamiast ORM. Przykład zastosowania:
<?php
$blog_model = new Blog_Model();
$blog_model->find_by_id(1);

$posts_model = $blog_model->find_related_posts();

// Funkcja find_related() zwraca model tabeli podanej w parametrze (działa podobnie do find_related_*)
$posts_stats_model = $posts_model->find_related('posts_stats')
// Funkcja as_array_assoc($pole) zwraca tablicę w której wartości $pole są kluczem a rekordy danymi.
// Można używać tylko gdy $pole jest unikatowe. Jeśli nie jest, patrz: as_array_assoc_group()
                                    ->as_array_assoc('post_id');

$posts_tags = $posts_model->find_related('posts_tags')
// Funckcja as_array_assoc_group($pole) działa podobnie do as_array_assoc() z tą różnicą, że pod
// każdym kluczem jest tablica zawierająca rekordy o takim samym $pole
                              ->as_array_assoc_group('post_id');

foreach($posts_model as $item) {
  echo 'Tytul: '.$item->title.'<br />';
  echo 'Czytano '.$posts_stats_model[$item->id]->views.' razy<br />';
  echo 'Tagi:';
  foreach ($posts_tags[$item->id] as $tag) {
    echo ' '.$tag->name;
  }
}
?>


Jeśli da się to zrobić łatwiej, szybciej lub zrobiłem jakiś błąd, to piszcie :)

Załączone pliki


One swallow does not make girlfriend




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych