Dobra biblioteka PHP ORM?

268

Czy istnieje dobra biblioteka odwzorowań obiektowo-relacyjnych dla PHP?

Znam PDO / ADO, ale wydają się one dostarczać jedynie abstrakcję różnic między dostawcami baz danych, a nie faktyczne mapowanie między modelem domeny a modelem relacyjnym. Szukam biblioteki PHP, która działa podobnie jak Hibernate dla Javy i NHibernate dla .NET.

Peter Mortensen
źródło

Odpowiedzi:

103

Wypróbuj RedBean , wymaga:

  • Bez konfiguracji
  • Brak bazy danych (tworzy wszystko w locie)
  • Brak modeli
  • itp.

Wykonuje nawet wszystkie operacje blokowania i transakcji oraz monitoruje wydajność w tle. (Heck! To nawet nie zbieranie śmieci ....) Najlepszy ze wszystkich ... nie trzeba pisać pojedynczego wiersza kodu ... ... Jesus to , warstwy ORM , uratował mi tyłek!

jnewman
źródło
9
Redbean to najlepsza warstwa abstrakcji bazy danych, z jaką kiedykolwiek pracowałem. nie „jeden z najlepszych” - najlepszy.
Nir Gavish
Bardzo fajne znalezisko. Jestem pod wielkim wrażeniem tego ORM, co najmniej
Christopher Tarquini
1
Porównaj RedBean z Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... Jezu. Przeczytałem pierwszą część dokumentacji i rozśmieszyłem złowrogiego dyktatora i już ją pobieram!
KJW
45

Są tylko dwa dobre: Doktryna i Propel . Preferujemy Doctrine i działa dobrze z Symfony . Jeśli jednak oprócz głównych potrzebujesz pomocy w zakresie baz danych, musisz napisać własny kod.

Peter Mortensen
źródło
Propel jest całkiem dobry jak na standardy php. Tworzy dość czysty kod, przyjazny dla środowiska IDE z modułami pobierającymi i ustawiającymi oraz bardzo czysty system abstrakcji kryteriów dla zapytań.
0x6A75616E
Ponieważ to pytanie dość mocno wiąże się z SO, chciałem zauważyć, że Propel jest projektem wycofanym od 2020 roku. Kompatybilność z PHP7 nigdy nie została zaimplementowana. Dlatego wybór Propela jako ORM dla nowego projektu oprogramowania w 2020 roku nie jest dobrym pomysłem.
mrodo
34

Axon ORM jest częścią Fat-Free Framework - zawiera maper w locie. Brak generatorów kodów. Brak głupich plików konfiguracyjnych XML / YAML . Odczytuje schemat bazy danych bezpośrednio z backendu, więc w większości operacji CRUD nie trzeba nawet rozszerzać modelu podstawowego. Działa ze wszystkimi głównymi silnikami baz danych obsługiwanymi przez PDO : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL itp.

/* SQL */
CREATE TABLE products (
    product_id INTEGER,
    description VARCHAR(128),
    PRIMARY KEY (product_id)
);

/* PHP */
// Create
$product=new Axon('products'); // Automatically reads the above schema
$product->product_id=123;
$product->description='Sofa bed';
$product->save(); // ORM knows it's a new record

// Retrieve
$product->load('product_id=123');
echo $product->description;

// Update
$product->description='A better sofa bed';
$product->save(); // ORM knows it's an existing record

// Delete
$product->erase();

Przede wszystkim wtyczka i towarzysząca jej warstwa dostępu do danych SQL są tak samo lekkie jak środowisko: 14 KB (Axon) + 6 KB (SQLdb). Beztłuszczowy to tylko 55 KB.

77%
źródło
15
Zawsze mnie martwi, gdy widzę coś takiego jak $product->load('product_id=123')w przykładzie.
Znarkus,
9
w przypadku paranoidów alternatywna składnia to$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
4
Fat-Free ma także NoSQL ORM dla MongoDB i plików płaskich
bcosca
28

Sam opracowuję Pork.dbObject. (Prosta implementacja ORM PHP i Active Record) Głównym powodem jest to, że większość ORM jest za ciężka.

Główną myślą Pork.dbObejct jest lekkość i łatwość konfiguracji. Brak wiązki plików XML, tylko jedno wywołanie funkcji w konstruktorze, aby go powiązać, oraz addRelation lub addCustomRelation, aby zdefiniować relację z innym obiektem dbObject.

Spójrz: Pork.dbObject

SchizoDuckie
źródło
1
Szukałem dziś lekkiej implementacji PHP ORM i znalazłem Pork.dbObject dzięki temu postowi. Działa świetnie! +1
E Dominique
6
Duude! To całkiem interesujące. Widzę, że najnowsza aktualizacja miała miejsce gdzieś w '09. Czy to jest nadal utrzymywane? Jeśli nie ... mógłbym to wskrzesić :)
VladFr
22

Wypróbuj Doctrine2 . Jest to prawdopodobnie najpotężniejsze narzędzie ORM dla PHP. Wspominam o tym oddzielnie od Doctrine 1, ponieważ jest to zupełnie inne oprogramowanie. Został przepisany od podstaw, wciąż jest w fazie beta, ale można go teraz wykorzystać i rozwinąć.

To bardzo złożony ORM, ale dobrze zaprojektowany. Wiele magii z oryginalnej Doktryny 1 zniknęło. Zapewnia kompletne rozwiązanie i możesz napisać własną ORM na Doctrine2 lub użyć tylko jednej z jej warstw .

tomp
źródło
Jedynym problemem, jaki mogę wymyślić w Doctrine2, jest to, że zależy od PHP 5.3 i nowszych wersji.
jblue
8
@jblue: To nie jest problem, to funkcja ;-). Duże biblioteki, takie jak Doctrine, potrzebują przestrzeni nazw.
Tom Pažourek,
„Wiele magii z oryginalnej Doktryny 1 zniknęło.” - Pod jakim względem jest to pozytywne?
Olivier „Ölbaum” Scherler
13

Właśnie zacząłem od Kohany i wydaje się najbliższa Ruby on Rails bez wywoływania złożoności wielu plików konfiguracyjnych, takich jak Propel .

Zak
źródło
Zgadzam się również, że Kohana jest strukturą najbardziej podobną do RoR w świecie PHP. Brakuje tylko rusztowań, a dzięki wsparciu CLI w KO3 to tylko kwestia zwijania rękawów i robienia tego.
Phillip Whelan
12

Sprawdź Outlet ORM . Jest prostszy niż Propel i Doctrine i działa podobnie do Hibernacji, tyle że z większym wyczuciem PHP.

Alvaro
źródło
3
Próbowałem tego. Musiałem określić te same właściwości obiektu w 3 miejscach - konfiguracji, modelu i schematu bazy danych. To dużo pracy przy wdrażaniu ORM IMO.
mixdev,
Gniazdo jest bardzo trudne w konfiguracji.
Lotus Notes
Próbowałem tego (1.0 RC1) i było bardzo wadliwe nawet w podstawowej funkcjonalności. I tak, jest wiele konfiguracji do napisania. Nie polecam tego
Szymon Wygnański,
11

Naprawdę podoba mi się Propel , tutaj możesz uzyskać przegląd, dokumentacja jest całkiem dobra i można ją uzyskać za pośrednictwem PEAR lub SVN.

Potrzebujesz tylko działającej instalacji PHP5 i Phing, aby zacząć generować klasy.

CMS
źródło
Propel może także „przebudowywać” istniejący schemat bazy danych - tworząc obiekty PHP na podstawie odczytu schematu bazy danych.
David Goodwin,
8

Znalazłem klasy związane z ORM w bibliotece PHP Flourish .

VDVLeon
źródło
6

Daj szansę na dORM, mapujący obiektowo obiekt dla PHP 5 . Obsługuje wszystkie rodzaje relacji (1 do 1), (1 do wielu), (wiele do wielu) i typy danych. Jest to całkowicie dyskretne: nie wymaga generowania kodu ani rozszerzania klasy. Moim zdaniem jest lepszy od wszelkich dostępnych ORM, w tym Doctrine i Propel. Jednak wciąż jest w fazie beta i może się znacznie zmienić w ciągu najbliższych kilku miesięcy. http://www.getdorm.com

Ma również bardzo małą krzywą uczenia się. Trzy główne metody, których będziesz używać to:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);
Olivier Lalonde
źródło
4

Obecnie pracuję nad phpDataMapper , który jest ORM zaprojektowanym tak, aby miał prostą składnię, taką jak projekt Ruby's Datamapper. Jest wciąż na wczesnym etapie rozwoju, ale działa świetnie.

Vance Lucas
źródło
4

Miałem wspaniałe doświadczenia z Idiorm i Paryżem . Idiorm to mała, prosta biblioteka ORM. Paris jest równie prostą implementacją Active Record opartą na Idiorm. To jest dla PHP 5.2+ z PDO. Jest idealny, jeśli chcesz czegoś prostego, co możesz po prostu wpaść do istniejącej aplikacji.

Sander Marechal
źródło
4

Próbowałem biblioteki ORM of Flourish .

eaguilar
źródło
Tak, pracuję nad tym od jakiegoś czasu. Prolishlib jest świetny, ale ORM wciąż ma trochę do zrobienia. Praca z tabelami łączenia, które mają dodatkowe właściwości lub klucze obce, tworzenie nowych obiektów może być nieco uciążliwe. Praca z prostymi modelami to pestka. Spójrz na Repose ORM lub Outlet, aby znaleźć alternatywną ORM dla PHP.
Michael,
3

Do czasu wydania PHP 5.3 nie oczekuj dobrej ORM. Jest to ograniczenie OO PHP.

znopx
źródło
Jak więc PHP 5.3 pomoże komuś napisać lepszą ORM? Nie widzę żadnego powodu.
Ionuț G. Stan
8
głównym powodem jest wprowadzenie późnego wiązania statycznego (słowo kluczowe „static”). przeczytaj o tym na blog.felho.hu/…
knoopx
2
ORM tak naprawdę nie potrzebuje zmiennych statycznych, można je dobrze zaprojektować przy użyciu tylko zmiennych instancji.
Tom Pažourek
To prawda, że ​​późne wiązanie statyczne powoduje, że każdą instancję ORM mojej ORM jest tak niska . Przed późnym wiązaniem statycznym było tak marnotrawne jak większość innych.
Xeoncross
3

Mój przyjaciel Kien i ja ulepszyliśmy wcześniejszą wersję ORM, którą napisał przed PHP 5.3. Zasadniczo przenieśliśmy na Active Record Ruby on Rails do PHP. Nadal brakuje niektórych kluczowych funkcji, takich jak transakcje, obsługa złożonego klucza głównego, kilka dodatkowych adapterów (obecnie działają tylko MySQL i SQLite 3). Ale jesteśmy bardzo blisko ukończenia tego. Możesz zajrzeć na PHP ActiveRecord z PHP 5.3 .

Jacques Fuentes
źródło
3

Wypróbuj PHP ADOdb.

Nie mogę powiedzieć, że jest najlepszy, ponieważ nie korzystałem z innych. Ale jest szybki, obsługuje Memcached i buforowanie.

I jest o wiele szybszy niż DB / Select Zend Framework .

Peter Mortensen
źródło
2
adodb nadaje się bardziej do smaku Thin Model / Fat Controller, co ogólnie nie jest dobrą rzeczą.
jblue
ADOdb ma ORM (ale nie jest tylko ORM). Ogólnie jest to naprawdę świetne rozwiązanie, działa znacznie lepiej niż Zend dla DB (jest wolniejsze niż ADOdb, Zend DB ma tylko ograniczoną obsługę JOIN), obsługuje automatyczne ucieczki z parametryzacją (w przeciwieństwie do Doctrine) wiele różnych backendów DB i ma ładną, rozszerzalną konstrukcję buforowania z super łatwą integracją pamięci Nie sądzę, aby w ogóle można było powiedzieć, że nadaje się ono do implementacji „Thin Model / Fat Controller” (możesz to zrobić lub nie, ale projekt ADOdb nie sprzyja tak czy inaczej).
Iain Collins
3

Spójrz na LEAP ORM dla Kohany . Współpracuje z wieloma bazami danych, w tym DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL i SQLite . Dzięki prostej funkcji autoload może współpracować z prawie każdym frameworkiem PHP. Kod źródłowy znajduje się na GitHub pod adresem https://github.com/spadefoot/kohana-orm-leap . Możesz sprawdzić samouczki LEAP online.

Biblioteka ORM działa z kluczami podstawowymi i kluczami złożonymi niecałkowitymi. Połączenia są zarządzane za pośrednictwem puli połączeń z bazą danych i działa z surowymi zapytaniami SQL. ORM ma nawet konstruktor zapytań, który sprawia, że ​​budowanie instrukcji SQL jest bardzo proste.

Matthew
źródło
2

Możesz sprawdzić Odpocząć, jeśli masz ochotę na przygodę. Podobnie jak Outlet , jest wzorowany na Hibernacji .

Jest wciąż na bardzo wczesnym etapie rozwoju, ale jak dotąd jedynymi ograniczeniami w modelu domeny są to, że klasy nie są oznaczone jako końcowe, a właściwości nie są oznaczone jako prywatne. Gdy przejdę do krainy PHP> = 5.3, spróbuję również wdrożyć obsługę własności prywatnych.

Beau Simensen
źródło
2

Jeśli szukasz ORM, który implementuje paradygmat Data Mappera, a nie Active Record, to zdecydowanie sugeruję przyjrzenie się GacelaPHP .

Funkcje Gacela:

  • Maper danych
  • Mapowanie klucza obcego
  • Mapowanie asocjacji
  • Mapowanie zależne
  • Dziedziczenie stołu betonowego
  • Obiekt zapytania
  • Mapowanie metadanych
  • Leniwy i chętny ładowanie
  • Pełna obsługa Memcached

Inne rozwiązania ORM są zbyt rozdęte lub mają uciążliwe ograniczenia przy opracowywaniu czegokolwiek zdalnie skomplikowanego. Gacela rozwiązuje ograniczenia związane z aktywnym podejściem do rekordów, wdrażając wzorzec mapowania danych, przy jednoczesnym utrzymywaniu wzdęcia na minimum, używając PDO do wszystkich interakcji z bazą danych i Memcached.

Noah Goodrich
źródło
2

MicroMVC ma ORM 13 KB, który opiera się tylko na klasie bazy danych 8 KB . Zwraca również wszystkie wyniki jako same obiekty ORM i używa późnego wiązania statycznego, aby uniknąć osadzania informacji o tabeli bieżącego obiektu i metadanych w każdym obiekcie. Powoduje to najtańszy narzut na ORM.

Działa z MySQL , PostgreSQL i SQLite .

Peter Mortensen
źródło
2

Brazylijski ORM: http://www.hufersil.com.br/lumine . Działa z PHP 5.2+. Moim zdaniem jest to najlepszy wybór dla Portugalczyków i Brazylijczyków, ponieważ ma łatwą do zrozumienia dokumentację i wiele przykładów do pobrania.

Paulo Araujo
źródło
2

Agile Toolkit ma własną unikalną implementację ORM / ActiveRecord i dynamicznego SQL .

Wprowadzenie: http://agiletoolkit.org/intro/1

Składnia (aktywny rekord):

$emp=$this->add('Model_Employee');
$emp['name']='John';
$emp['salary']=500;
$emp->save();

Składnia (dynamiczny SQL):

$result = $emp->count()->where('salary','>',400)->getOne();

Podczas gdy Dynamic SQL i Active Record / ORM są użyteczne bezpośrednio, Agile Toolkit dodatkowo integruje je z interfejsem użytkownika i interfejsem użytkownika jQuery . Jest to podobne do JSF, ale napisane czystym PHP.

$this->add('CRUD')->setModel('Employee');

Spowoduje to wyświetlenie CRUD AJAXified dla modelu pracownika.

romaninsh
źródło
2

NotORM

include "NotORM.php";
 $pdo = new PDO("mysql:dbname=software");
 $db = new NotORM($pdo);
 $applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
foreach ($applications as $id => $application) {
echo "$application[title]\n";
}
Charlie Chai
źródło
2

PHP ORM Faces Do rozszerzenia PDO. Zobacz PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Kurt
źródło
1. Strona jest turecka; 2. Twój kod nie różni się niczym od kodu, którego używałbyś np. Z Doctrine.
The Pellmeister 10.01.11
1

Kolejnym świetnym open source PHP ORM, którego używamy, jest PHPSmartDb . Jest stabilny i sprawia, że ​​kod jest bardziej bezpieczny i czysty. Baza danych w nim zawarta jest najłatwiejsza, jaką kiedykolwiek korzystałem z PHP 5.3.

Joe
źródło
1

Doctrine jest prawdopodobnie najlepszym wyborem. Przed Doctrine DB_DataObject było zasadniczo jedynym innym narzędziem, które było dostępne na zasadach open source.

anon
źródło
1

Jeśli szukasz ORM, takiego jak Hibernacja , powinieneś spojrzeć na PMO .

Można go łatwo zintegrować z architekturą SOA (do opracowania jest tylko klasa usług internetowych).

anonimowych
źródło