From ef81c440220286dafb7b5f3c639d1d76e0f32f62 Mon Sep 17 00:00:00 2001
From: Fabio Bas Rekordy Aktywne są obiektami, które opakowują wiersz w bazie danych lub widoku,
- obudowują (ang. encapsulate) dostęp do bazy danych oraz dziedziny logiki dla tych danych.
+ obudowują (ang. encapsulate) dostęp do bazy danych oraz dziedziny logiki dla tych danych.
Podstawą Rekordu Aktywnego są klasy biznesowe np. klasa
Produkty, które są bardzo podobne do struktury rekordu należącego do bazy danych. Każdy Rekord Aktywny jest odpowiedzialny
za zapisywanie i łądowanie danych do i z bazy danych. Rekord Aktywne jest dobrym wyborem dla dziedziny logiki, która nie jest zbyt złożona, tak jak tworzenie, odczyty, aktualizacje oraz usuwanie.
- Pochocne (ang. derivations) oraz sprawdzenia bazujące na pojedyńczym rekordzie sprawdzają się dobrze w tej konstrukcji.
+ Pochocne (ang. derivations) oraz sprawdzenia bazujące na pojedyńczym rekordzie sprawdzają się dobrze w tej konstrukcji.
Rekord Aktywne ma podstawową zaletę, którą jest prostota. Łatwo jest stworzyć Rekord Aktywny, łatwo go również zrozuieć.
Jednakże, jeśli twoja logika biznesowa staje się coraz bardziej złożona, wkrótce będziesz chciał
+ Jednakże, jeśli twoja logika biznesowa staje się coraz bardziej złożona, wkrótce będziesz chciał
używać bezpośrednich relacji, zbiorów, dziedziczenia twojego obiektu i tak dalej. Nie da się tego łatwo odwzorować za pomocą Rekordu Aktywnego,
a dodawanie ich po kawałku staje się bardzo kłopotliwe. Innym argumentem przeciw Rekordowi Aktywnemu jest fakt, że łączy model obiektowy z modelem baz danych.
To czyni trudniejszym refaktoring, gdy projekt idzie naprzód.
Alternatywą jest używanie wzorca Data Mapper (mapa danych), który odseparowuje role obiektu biznesowego od tego jak te obiekty są przechowywane.
- Prado dostarcza
+ Prado dostarcza
Prado provides a darmowy wybór pomiędzy rekordem aktywnym a SqlMap Data Mapper.
SqlMap Data Mapper może być uzywany do wczytania obiektów Rekordu Aktywnego, i na odwrót, te Rekordy Aktywne mogą zostać użyte do aktualizacji bazy danych.
Związek pomiędzy Rekordem Aktywnym a SqlMap przedstawiony jest na kolejnym diagramie. Więcej informacji związanych z SqlMap Data Mapper można znaleźć w
@@ -33,7 +33,7 @@
- Klasa Rekordu aktywnego posiada funkcjonalność do przeprowadzenia następujących zadań:
+ Klasa Rekordu aktywnego posiada funkcjonalność do przeprowadzenia następujących zadań:
Jest to implikacja modelu wynikająca z następującego pytania:
"Czy myślisz o kliencie jako o obiekcie, którego któy jest tylko jeden, czy też myślisz o obiekcie na którym działasz jako o kopii bazy danych.
-Inne mapowania O/R implikują, że istnieje tylko jeden obiekt Klienta z KlientID 100
+Inne mapowania O/R implikują, że istnieje tylko jeden obiekt Klienta z KlientID 100
Other O/R mappings will imply that there is only one Customer object with custID 100 i to dosłownie jest ten klient.
-Jeśli pobierzesz klienta i zmienisz pole w nim, wtedy masz zmienionego tego klienta.
+Jeśli pobierzesz klienta i zmienisz pole w nim, wtedy masz zmienionego tego klienta.
"To kontroastuje z: zmieniłeś tą kopię klienta ale nie tamtą kopię.
Jeśli dwóch ludzi zaktualizuje kleinta z dwóch kopii obiektu, kto zaktualizuje pierwszy lub być może ostanie wygrywa." [A. Hejlsberg 2003]
-Implementacja Aktywnego Rekordu wykorzystuje kalsy Prado DAO by uzyskać dostęp do danych. Aktualna implementacja Aktywnego Rekordu wspiera następujace bazy danych
+Implementacja Aktywnego Rekordu wykorzystuje kalsy Prado DAO by uzyskać dostęp do danych. Aktualna implementacja Aktywnego Rekordu wspiera następujace bazy danych
Rekord Aktywny (ang. Active Record)
Kiedy używać?
Wspierane bazy danych
Każda kolumna tablicy "users" musi posiadać odpowiadającą jej właściwość o tej samej nazwie co kolumna w tablicy w klasie UserRecord. Oczywiście, możesz zdefiniować dodatkowe zmienne lub właściwości, które nie istnieją w strukturze tablicy. - Stała TABLE jest opcjonalna w klasie , kiedy nazwa klasy jest taka sama jak nazwa tablicy w bazie danych, w przeciwnym przypadku TABLE + Stała TABLE jest opcjonalna w klasie , kiedy nazwa klasy jest taka sama jak nazwa tablicy w bazie danych, w przeciwnym przypadku TABLE musi określać nazwę tablicy, która odpowiada klasie Rekordu Aktywnego.
@@ -114,7 +114,7 @@ Możesz określić kwalifikowane (ang. qualified) nazwy tablic np dla MySQL, Odkąd TActiveRecord rozszerza TComponent, metody setter i getter mogą zostać zdefiniowane - by umożliwić kontrolę nad tym jak zmienne są ustawiane i zwracane. Na przykłąd dodanie właściwości $level + by umożliwić kontrolę nad tym jak zmienne są ustawiane i zwracane. Na przykłąd dodanie właściwości $level do klasy UserRecord:Więcej szczegółów dotyczących TComponent można znaleźć dokumentacji komponentów. +
Więcej szczegółów dotyczących TComponent można znaleźć dokumentacji komponentów. Później użyjemy metod getter/setters by umożliwić opóźnione ładowanie (ang. lazy loading) obiektów relacji.
Domyślne połączenie z bazą dla Rekordu Aktywnego może zostać ustawione następujaco. - Zobacz Ustanawianie połączenia z bazą + Zobacz Ustanawianie połączenia z bazą by uzyskać ogólnie dalsze szczegóły odnośnie tworzenia połączenia z bazą danych.
Alternatywnie, możesz stworzyć klasę bazową i nadpisać metodę getDbConnection() -do zwracania połączenia z bazą. To jest prosty spodób, by umożliwić wielkokrotne połączenia do wielu baz danych. +do zwracania połączenia z bazą. To jest prosty spodób, by umożliwić wielkokrotne połączenia do wielu baz danych. Następujący kod demonstruje definiowanie połączenia z bazą danych w klasie bazowej (nie ma potrzeby by ustawiać połączenie DB gdziekolwiek indziej).
- Klasa TActiveRecord dostarcza wielu wygodnych metod do wyszukiwania rekordów z bazy danych.
+ Klasa TActiveRecord dostarcza wielu wygodnych metod do wyszukiwania rekordów z bazy danych.
Najprostszym jest znajdowanie jednego rekordu poprzez dopasowanie klucza głównego lub klucza złożonego (ang. composite key)
(klucz główny skłądający się z wielu kolumn).
Zobacz
Znajdują rekordy używając pełnego zapytania SQL z tym, że findBySql() -zwraca Rekord Aktywny a findAllBySql()zwraca tablicę obiektów rekordów. +
Znajdują rekordy używając pełnego zapytania SQL z tym, że findBySql()
+zwraca Rekord Aktywny a findAllBySql()zwraca tablicę obiektów rekordów.
Dla każdej zwróconej kolumny, odpowiadająca klasa Rekordu Aktywnego musi posiadać zdefiniowaną zmienną lub właściwość odpowiadającą nazwie kolumny.
Widzimy, że nowe obiekty Rekordu Aktywnego są tworzone zarówno przez jedną z metod find*() -lub poprzez stworzenie nowej instancji poprzez użycie polecenia PHP new. Obiekty stworzone przez metodę find*() +lub poprzez stworzenie nowej instancji poprzez użycie polecenia PHP new. Obiekty stworzone przez metodę find*() zaczynają ze stanem czysty (ang. clean). Nowa instancja TActiveRecord stworzona inaczej niż za pomocą metod find*() zaczyna ze stanem nowy (ang. new). -Kiedykolwiek wywołasz metodę save() na obiekcie TActiveRecord, obiekt przyjmuje stan czysty. -Obiekty będące czystymi stają się brudne (ang. dirty) kiedy jeden lub więcej ze stwoich wewnętrznych stanów ulegnie zmianie. +Kiedykolwiek wywołasz metodę save() na obiekcie TActiveRecord, obiekt przyjmuje stan czysty. +Obiekty będące czystymi stają się brudne (ang. dirty) kiedy jeden lub więcej ze stwoich wewnętrznych stanów ulegnie zmianie. Wywoałanie metody delete() obiektu kończy cykl życia, żadne inne akcje nie mogą być wywołane na obiekcie.
@@ -451,7 +451,7 @@ $finder->deleteBy_Username_And_Password($name,$pass);Wszystkie obiekkty Rekordu Aktywnego zawierają właściwość DbConnection, +
Wszystkie obiekkty Rekordu Aktywnego zawierają właściwość DbConnection,
która może być używana by uzyskać obiekt tranzakcyjny.
Używając OnExecuteCommand możemy przypiąć uchwyt zdarzenia by logować całe -zapytanie SQL wwywoływane dla danej instancji lub klasy TActiveRecord. Na przykład definiujemy klasę bazową i nadpisujemy +
Używając OnExecuteCommand możemy przypiąć uchwyt zdarzenia by logować całe +zapytanie SQL wwywoływane dla danej instancji lub klasy TActiveRecord. Na przykład definiujemy klasę bazową i nadpisujemy metodę getDbConnection() lub konstruktor.
@@ -537,12 +537,12 @@ W następnych sekcjach będziemy rozważać nastepujące relacje pomiędzy tabel class="figure" />-Istnieje rozbieżność pomiędzy relacjami w obiektach i relacjami w tablicach. +Istnieje rozbieżność pomiędzy relacjami w obiektach i relacjami w tablicach. Po pierwsze jest różnica w reprezentacji. Obiekty trzymają powiązanie poprzez przechowywanie referencji, które są trzymane poprzez zarządzające pamięcią środowiko uruchomieniowe. Bazy relacyjne trzymają powiązanie poprzez utworzenie klucza do innej tablicy. - Po drugie, obiekty mogą łatwo uzywać kolekcji by trzymać wielokrotnie referencje z jednego pola, -to handle multiple references from a single field, gdyż normalizacja zmusza wszystkie powiązania relacji encji by były pojedyńczymi wartościami. -To prowadzi do odwrócenia struktury danych pomiędzy obiektami i tablicami. + Po drugie, obiekty mogą łatwo uzywać kolekcji by trzymać wielokrotnie referencje z jednego pola, +to handle multiple references from a single field, gdyż normalizacja zmusza wszystkie powiązania relacji encji by były pojedyńczymi wartościami. +To prowadzi do odwrócenia struktury danych pomiędzy obiektami i tablicami. Podejście zastosowane w modelu Rekordu Aktywnego Prado uzywa ograniczeń kluczów obcych tablicy do wyprowadzenia relacji obiektów. To implikuje fakt wspierania ograniczeń kluczów obcych dla bazy danych.
@@ -564,8 +564,8 @@ CREATE TABLE bar -Relacja pól pomiędzy tablicami Teams and Players jest znana jako relacja jeden-do-wielu (ang. 1-M). Oznacza to, że jeden Team moze zawierać zero lub więcej Players. Z punktu widzenia relacji obiektów +
Relacja pól pomiędzy tablicami Teams and Players jest znana jako relacja jeden-do-wielu (ang. 1-M). Oznacza to, że jeden Team moze zawierać zero lub więcej Players. Z punktu widzenia relacji obiektów powiemy, że obiekt TeamRecord posiada wiele (ang. has many) obiektów PlayerRecord. (Zauważ odwrócenie kierunku relacji pomiędzy tablicami a obiektami)
@@ -1074,7 +1074,7 @@ class PlayerRecord extends BaseFkRecordWe first need to change the $skills=array() declaration to a private property $_skills (notice the underscore) and set it to null instead. This allows us to define the skills property using getter/setter methods -(see Components for details). The getSkills() +(see Components for details). The getSkills() getter method for the skills property will lazy load the corresponding skills foreign record when it is used as follows. Notice that we only do a lazy load when its $player_id is not null (that is, when the record is already fetched from the database or player id was already set). -- cgit v1.2.3