2012-01-12 13 views
6

Bardzo podoba mi się Active Record CodeIgniter i jak ładnie to pozwala na wszystkie moje potrzebne zapytania do bazy danych.Co robi Doctrine Add Above Active Record - CodeIgniter?

Ale czytałem także o ORMach takich jak Doctrine. Kiedy czytam dokumentację Doctrine, nie wydaje mi się to tak oczywiste, jak użycie Active Record, i nie widzę, co czyni ją lepszą (jeśli tak).

Co pozwala Doctrine, która nie jest możliwa w Active Record? Czy Doctrine wykonuje tę samą pracę szybciej, łatwiej, lepiej? A może robi to, czego nie można zrobić w Active Record?

Najlepiej byłoby, gdyby ludzie mogli publikować przykłady zadań pokazujących, o czym mówimy.

Dzięki Matthew

+0

Doctrine jest pełnowartościową ORM, która implementuje aktywny wzór rekordu. Aktywna klasa rekordu CodeIgniter to raczej narzędzie do budowania zapytań oparte na "zmodyfikowanej" wersji wzorca. – birderic

+0

Witam birderic, Dzięki za szybką odpowiedź. Czy możesz podać mi przykład, w którym będzie to miało miejsce? Czy mówimy o takich operacjach jak CRUD? – MatthewSchenker

+0

Napiszę dłuższą odpowiedź. Nie mam doświadczenia z Doctrine, ale postaram się jak najlepiej porównać te dwa. – birderic

Odpowiedz

9

doktryny jest pełnoprawnym ORM, który implementuje Active Record wzór. Aktywna klasa rekordu CodeIgniter to budowniczy zapytań/opakowanie baz danych oparte na "zmodyfikowanej" wersji wzorca.

Oświadczenie: Nigdy nie używałem Doctrine. Zrobię co w mojej mocy, aby zilustrować różnice między aktywną implementacją rekordu CodeIgniter a Doctrine, w oparciu o moje zrozumienie.

Korzystanie aktywną klasę rekordu CodeIgniter jest, można wdrożyć model takiego:

class User_model extends CI_Model 
{ 

    public function get_user_by_username($username) 
    { 
     // Build query using active record methods 
     $this->db->where('username', $username); 
     $this->db->where('active', 1); 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->result(); 
    } 

    // ... 

} 

Jesteś w zasadzie budowania kwerendy przy użyciu metod aktywnych rekordów. Łatwo zobaczyć, jak każda z metod (where(), get(), itp.) Mapuje do surowego kodu SQL. Zaletą korzystania z aktywnych metod zapisu w przeciwieństwie do zwykłego $this->db->query() jest to, że CodeIgniter kompiluje każde zapytanie na podstawie używanego sterownika bazy danych. Poza tym aktywna implementacja rekordów CodeIgniter nie robi zbyt wiele. Wszelkie zapytania, które potrzebujesz, musisz utworzyć. Mam nadzieję, że zilustrowałem, w jaki sposób metody aktywnych rekordów są podobne do konstruktora zapytań.

Należy pamiętać, że poniższy przykładowy kod może być niepoprawny. Korzystanie z doktryny można mieć model takiego:

/** @Entity */ 
class User 
{ 

    /** @Column(type="integer") */ 
    private $id; 

    /** @Column(length=50) */ 
    private $username; 

    // ... 

} 

Następnie do korzystania z modelu i związane z aktywną funkcję nagrywania, byś zrobił coś takiego:

// Instantiate object 
$user = new User(); 

// Set properties 
$user->username = 'some_username'; 

// Save object 
$user->save(); 

// Access properties 
echo $user->id; 

to tylko zarysowania powierzchni pod względem tego, co potrafi Doktryna. Możesz ustawić domyślne wartości właściwości lub określić relacje między tabelami. Zauważ, że nie napisałem żadnego SQL ani nie zbudowałem zapytania. Właśnie ustawiłem właściwości obiektu, a następnie go zapisałem. Doktryna zajmuje się resztą.

Należy pamiętać, że Doctrine zawiera własny kreator zapytań, więc w pewnym sensie robi to, co robi aktywny rekord CodeIgniter, i wiele więcej.

Używanie Doctrine jest podobne do implementacji aktywnego wzorca rekordu CakePHP lub Ruby on Rails. Możesz tam zajrzeć, by uzyskać dodatkowe informacje na temat wzoru. Przykłady CakePHP mogą być szczególnie łatwe do strawienia, jeśli pochodzisz z tła CodeIgniter.

Aby odpowiedzieć na niektóre z pozostałych pytań, nie sądzę, że jest coś, co czyni Doktrynę lepszą niż metody aktywnego rekordu CodeIgniter. Może być bardziej zaawansowany, ale jak każda inna biblioteka, chcesz wybrać najlepsze narzędzie do pracy.Jeśli jesteś zadowolony z aktywnych metod zapisu CodeIgniter i nie widzisz potrzeby zaawansowanej ORM, pomiń to.

+1

birderic, dziękuję uprzejmie za tę odpowiedź. Pomaga mi zobaczyć, o co mi chodziło. Studiuję też bazę danych Symfony i wydaje mi się, że przypominają one metody CakePHP. Cieszę się, że obie metody mogą osiągnąć te same ogólne cele, mimo że dostają się tam inaczej. – MatthewSchenker

+0

Doctrine 2.x nie używa rekordu aktywnego. Używa wzoru odwzorowania danych. –

18

Po pierwsze, o czym mówi Doktryna, 1 lub 2?
Istnieje ogromna różnica. Jedyne, co mają ze sobą wspólnego, to to, że oba są pełnoprawnymi ORM-ami. W przeciwnym razie nie ma żadnego połączenia między tymi dwoma.

Nauki 1 opiera się na ActiveRecords, doktrynę 2 opiera się na danych odwzorowujący wzorca.
Oba mogą wykonywać te same czynności, ale między nimi występują pewne istotne różnice.

Ogólnie rzecz biorąc program odwzorowujący dane jest mniej "przyjazny dla programisty", ale powinien mieć lepszą wydajność. Czemu? W rzeczywistości jest to dość proste. Przy aktywnych rekordach każda jednostka wie wszystko "dookoła", relacje z innymi podmiotami itp. Z modułem odwzorowującym dane obiekty są głupie i lekkie, istnieje centralna jednostka (EntityManager/UnitOfWork w Doctrine2), która obsługuje wszystkie odwzorowania relacji. Więc pod względem wykorzystania pamięci i wydajności Mapowanie danych powinno być szybsze.
The Doctrine faceci mówią, że Doctrine2 jest co najmniej 50% szybszy od Doctrine1 (są też inne różnice, nie tylko wzorzec projektowy).

Jeśli masz na to ochotę, możesz nawet zaimplementować ActiveRecords na programatorze danych Doctrine2. Spójrz na to blog post. Używam tego podejścia tylko w fazie rozwoju, aby zachować jak najmniej kodu. Po przejściu do produkcji zabiję dodatkową warstwę ActiveRecords i wycofam do domyślnego programu odwzorowującego dane Doctrine2.

Wniosek jest taki, że można zrobić wszystko za jednym zamachem, ale w ten sam sposób można powiedzieć, że można zrobić wszystko przy użyciu surowego kodu SQL. Jeśli jesteś początkującym w świecie ORM, sugerowałbym korzystanie z ActiveRecords, ponieważ jest to proste i (zwykle) wymaga mniej kodu. Z drugiej strony, jeśli budujesz duży, złożony model, myślę, że lepszym rozwiązaniem jest maper danych.

Może coś złego, ale tak to zrozumiałem.

Jeśli chodzi o porównanie między CodeIgniters ActiveRecords i Doctrine (1 lub 2), nie mogę powiedzieć, ponieważ nigdy nie użyłem CodeIgniter. Jedno jest pewne, Doctrine ma o wiele więcej funkcji niż domyślna ORM dla CodeIgniters. Na przykład: nawodnienie wyniku, dziedziczenie (pojedyncza tabela, tabela klas), wstępne pobieranie, leniwy ładowanie, dodatkowe leniwy ładowanie, rozszerzenia, zachowania, optymalizacja, proxy, obsługa datetime ... Jest to masywna i pełnowymiarowa ORM z dużą ilością funkcje, podczas gdy moje doświadczenie z jakąkolwiek "domyślną strukturą ORM" jest takie, że ich głównym celem jest być możliwie najprostszym, tak aby nowicjusz mógł łatwo się z tym uporać. Doktryna jest potężną bestią i na pewno potrafi zrobić wiele rzeczy w bardziej efektywny i/lub logicznie bardziej poprawny sposób niż wbudowana funkcja ORI CodeIgniter. Minusem jest to, że potrzeba więcej czasu na naukę i kodowanie, a to jest ogromna biblioteka, z tysiącami plików, więc tylko po to, aby wszystko działało, dodaje trochę narzut w porównaniu do lżejszej alternatywy.

+0

ZolaKt, dziękuję za odpowiedź. Mówię o najnowszych wersjach wszystkiego. Podoba mi się te dodatkowe funkcje, które opisujesz w Doctrine. Ogólnie rzecz biorąc, bardzo podoba mi się CodeIgniter, ale jestem nowy w frameworkach. Wydaje się, że moim najlepszym podejściem byłoby opanowanie klasy Active Record CodeIgniter, a potem użycie Doctrine w CodeIgniter w późniejszym czasie. – MatthewSchenker

+0

To jest czysto subiektywne, ale jeśli planujesz nauczyć się frameworka, spójrz na Kohanę. Jest on nieco bardziej elastyczny dzięki integracji innych bibliotek niż CodeIgniter. Najnowsze wersje są w porządku, ale jak już powiedziałem, są to 2 zupełnie różne projekty, na dwóch różnych wzorach. Jeśli robisz "mniejszy" kij projektu z domyślnymi aktywnymi rekordami ORM. Mogą zrobić prawie wszystkie Doctrine, chociaż niektóre rzeczy muszą być wykonane ręcznie. Jedna rzecz, którą zauważyłem, bardzo rzadko te ORMy wspierają dziedziczenie, więc jeśli potrzebujesz, znajdź coś, co może to zrobić, takie jak Doctrine. – ZolaKt

+0

Kolejna porada. Czytanie i wypróbowanie zanim zdecydujesz, którego użyć. Nie ograniczaj się do CodeIgniters ORM, istnieje kilka dobrych aktywnych ORMów w PHP. Wszystko zależy od wzoru. Jeśli znasz jedną aktywną rekordy ORM, poznasz drugą w krótkim czasie. To samo dotyczy programu odwzorowującego dane. Na przykład, jeśli znasz Doctrine, poznasz (N) Hibernate. Jeśli zdecydujesz, że wolisz aktywne rekordy nad programem odwzorowującym dane, możesz również wypróbować Propel. Pełnoprawna ORM oparta na aktywnych rekordach. Z tego, co widziałem, jedyną alternatywą PHP do Doctrine, jeśli chcesz wszystkie "fantazyjne" funkcje – ZolaKt