İyi PHP ORM Kütüphanesi?


268

PHP için iyi bir nesne-ilişkisel eşleme kütüphanesi var mı?

PDO / ADO biliyorum , ama sadece veritabanı satıcıları arasındaki fark soyutlama sağlamak gibi görünüyor etki alanı modeli ve ilişkisel modeli arasında gerçek bir eşleme. Hibernate Java ve NHibernate .NET için yaptığı şekilde benzer işlevler bir PHP kitaplığı arıyorum .

Yanıtlar:



103

RedBean'ı deneyin , gerektirir:

  • Yapılandırma yok
  • Veritabanı yok (her şeyi anında oluşturur)
  • Model yok
  • vb.

Hatta sizin için tüm kilitleme ve işlemleri yapar ve arka planda performansı izler. (Heck! Hatta çöp toplama bile ....) En iyisi ... tek bir kod satırı yazmak zorunda değilsiniz ... İsa bu , ORM katmanı , beni kıçımı kurtardı!


9
redbean şimdiye kadar çalıştığım en iyi veritabanı soyutlama katmanı eller aşağı olduğunu. "en iyilerinden biri" değil - en iyisi.
Nir Gavish

Çok güzel bulmak. En azını söylemek gerekirse bu ORM'den çok etkilendim
Christopher Tarquini


1
RedBean'ı Doktrin ile karşılaştırın: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber 17:11

3
+1 +1 +1 +! +! !!!! ... İsa belgelerin ilk bölümünü okudum ve beni uğursuz diktatör kahkahaları attı ve ben zaten indiriyorum!
KJW

45

Sadece iki iyi şey var: Doktrin ve Propel . Doktrin'i destekliyoruz ve Symfony ile iyi çalışıyor . Ancak, ana desteklerin yanında veritabanı desteği arıyorsanız, kendi kodunuzu yazmanız gerekir.


Pervane php standartlarına göre oldukça iyidir. Alıcılar ve ayarlayıcılarla IDE dostu olan oldukça temiz kodlar ve sorgular için çok temiz bir Kriterler soyutlama sistemi üretir.
0x6A75616E

Bu soru SO etrafında biraz bağlantılı olduğundan, Propel'in 2020 itibariyle durdurulan bir proje olduğunu belirtmek istedim. PHP7 uyumluluğu asla uygulanmadı. Bu yüzden 2020'de yeni bir yazılım projesi için Propel'i ORM olarak seçmek iyi bir fikir değil.
mrodo

34

Axon ORM, Yağsız Çerçevenin bir parçasıdır - anında bir eşleştiriciye sahiptir. Kod oluşturucu yok. Aptal XML / YAML yapılandırma dosyası yok. Veritabanı şemasını doğrudan arka uçtan okur, bu nedenle çoğu CRUD işleminde bir temel modeli genişletmeniz bile gerekmez. Tüm büyük PDO destekli veritabanı motorlarıyla çalışır: MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL , vb.

/* 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();

En önemlisi, eklenti ve beraberindeki SQL veri erişim katmanı, çerçeve kadar hafiftir: 14 KB (Axon) + 6 KB (SQLdb). Yağsız sadece 55 KB'dir.


15
$product->load('product_id=123')Bir örnekte olduğu gibi bir şey gördüğümde beni her zaman endişelendiriyor .
Znarkus

9
paranoidler için alternatif sözdizimi$product->load(array('product_id=:id',array(':id'=>123)));
bcosca

4
Fat-Free ayrıca MongoDB ve düz dosyalar için NoSQL
ORM'lere sahiptir

28

Kendi başıma Pork.dbObject geliştiriyorum. (Basit bir PHP ORM ve Aktif Kayıt uygulaması) Ana nedeni çoğu ORM çok ağır buluyorum.

Pork.dbObejct'in ana düşüncesi hafif ve kurulumu basittir. Bir grup XML dosyası, sadece bir işlev onu bağlamak için yapıcıda çağırır ve başka bir dbObject ile ilişki tanımlamak için bir addRelation veya addCustomRelation.

Bir göz atın: Pork.dbObject


1
Bugün hafif bir PHP ORM uygulaması arıyordum ve bu yazı sayesinde Pork.dbObject'i buldum. Harika çalışıyor! +1
E Dominique

6
Duude! Bu oldukça ilginç. En son güncellemenin '09'da bir yerde gerçekleştiğini görüyorum. Bu hala devam ediyor mu? Değilse ... Ben sadece canlandırmak olabilir :)
VladFr

22

Doctrine2'yi deneyin . Muhtemelen PHP için en güçlü ORM aracıdır. Doktrin 1'den ayrı olarak bahsediyorum, çünkü tamamen farklı bir yazılım parçası. Sıfırdan yeniden yazılmıştır, hala beta aşamasındadır, ancak şimdi kullanılabilir ve geliştirilmiştir.

Çok karmaşık bir ORM, ama iyi tasarlanmış. Orijinal Doktrin 1'den çok fazla sihir kayboldu. Eksiksiz bir çözüm sunar ve Doctrine2'nin üzerine kendi ORM'nizi yazabilir veya katmanlarından yalnızca birini kullanabilirsiniz .


Doctrine2 ile düşünebildiğim tek sorun PHP 5.3 ve üzeri sürümlere bağımlı olması.
jblue

8
@jblue: Sorun değil, bir özellik ;-). Doktrin gibi büyük kütüphanelerin ad alanlarına ihtiyacı vardır.
Tom Pažourek

“Orijinal Doktrin 1'den çok fazla sihir kayboldu.” - Bu ne açıdan olumlu?
Olivier 'Ölbaum' Scherler

13

Kohana ile yeni başladım ve Propel gibi çoklu yapılandırma dosyalarının tüm karmaşıklığını çağırmadan Ruby on Rails'e en yakın görünüyor .


Ayrıca Kohana'nın PHP dünyasındaki RoR'a en çok benzeyen çerçeve olduğunu kabul ediyorum. Tek eksik olan iskele ve KO3'teki CLI desteği ile sadece birisinin kollarını kıvırması ve yapması meselesi.
Phillip Whelan

12

Outlet ORM'ye göz atın . Propel ve Doctrine'den daha basittir ve Hibernate'e benzer şekilde çalışır, sadece daha fazla PHP hissi ile.


3
Bunu denedim. Aynı nesne özelliklerini 3 yerde belirtmek zorunda kaldım - config, model ve veritabanı şeması. Bu bir ORM IMO'yu uygulamak için çok iş.
mixdev

Çıkış çok yapılandırma ağırdır.
Lotus Notes

Bu (1.0 RC1) denedim ve çekirdek işlevselliği bile çok adamcağız. Ve evet, yazılacak çok fazla yapılandırma var. Ben tavsiye etmiyorum.
Szymon Wygnański

11

Propel'i gerçekten seviyorum , burada bir genel bakış elde edebilirsiniz, belgeler oldukça iyi ve PEAR veya SVN aracılığıyla alabilirsiniz.

Sınıf oluşturmaya başlamak için yalnızca çalışan bir PHP5 yüklemesi ve Phing gerekir.


Propel ayrıca, mevcut bir veritabanı şemasını 'tersine mühendislik' yapabilir - veritabanı şemasını okumaktan PHP nesneleri oluşturur.
David Goodwin



6

PHP 5 için bir nesne ilişkisel eşleyicisi olan dORM'a bir şans verin . Her türlü ilişkiyi (1'e 1), (1'e çok), (çoktan çoğa) ve veri türlerini destekler. Tamamen göze batmaz: kod üretimi veya sınıf genişletme gerekmez. Benim düşünceme göre, orada herhangi bir ORM'den daha üstündür, Doktrin ve Propel dahil. Bununla birlikte, hala beta aşamasındadır ve önümüzdeki birkaç ay içinde önemli ölçüde değişebilir. http://www.getdorm.com

Ayrıca çok küçük bir öğrenme eğrisi vardır. Kullanacağınız üç ana yöntem şunlardır:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);

4

Şu anda Ruby'nin Datamapper projesi gibi basit bir sözdizimi için tasarlanmış bir ORM olan phpDataMapper üzerinde çalışıyorum . Hala erken gelişme aşamasında, ama harika çalışıyor.


4

Idiorm ve Paris ile harika deneyimler yaşadım . Idiorm küçük, basit bir ORM kütüphanesidir. Paris, Idiorm üzerine kurulmuş aynı derecede basit bir Aktif Kayıt uygulamasıdır. PDO ile PHP 5.2+ için. Mevcut bir uygulamaya girebileceğiniz basit bir şey istiyorsanız mükemmeldir.


4

Evet, bir süredir bununla çalışıyorum. Flourishlib harika, ama ORM'nin hala yapacak bir işi var. Ek özelliklere veya yabancı anahtarlara sahip birleştirme tablolarıyla çalışmak, yeni nesneler oluşturmak biraz sıkıcı olabilir. Basit modellerle çalışmak çok kolaydır. PHP için alternatif bir ORM için Repose ORM veya Outlet'e bakın.
Michael

3

PHP 5.3 sürümüne kadar iyi bir ORM olmasını beklemeyin. PHP'nin OO sınırlamasıdır.


Peki PHP 5.3 birisinin daha iyi bir ORM yazmasına nasıl yardımcı olur? Hiç bir neden göremiyorum.
Ionuț G. Stan

8
ana nedeni geç statik bağlanma ("statik" anahtar kelime) girişidir. blog.felho.hu/…
knoopx

2
ORM'nin statik değişkenlere gerçekten ihtiyacı yoktur, sadece örnek değişkenleri kullanılarak iyi bir şekilde tasarlanabilirler.
Tom Pažourek

Doğru, geç statik bağlanma, kendi ORM'imin her ORM örneğini bu kadar düşük alabilmemin sebebidir . Geç statik bağlanmadan önce, çoğu diğerleri kadar savurgandı.
Xeoncross

3

Arkadaşım Kien ve ben PHP 5.3'ten önce yazmış olduğu bir ORM'nin önceki bir versiyonunu geliştirdik. Temel olarak Ruby on Rails'in Aktif Kaydı'nı PHP'ye taşıdık . İşlemler, bileşik birincil anahtar desteği, birkaç adaptör (şu anda yalnızca MySQL ve SQLite 3 gibi çalışıyor) gibi istediğimiz bazı temel özelliklerden yoksun. Ancak, bu şeyleri bitirmeye çok yakınız. PHP 5.3 ile PHP ActiveRecord'a bir göz atabilirsiniz .


3

PHP ADOdb'yi deneyin.

En iyisi olduğunu söyleyemem, çünkü diğerlerini kullanmadım. Ama hızlı, destekliyor Memcached'ı ve önbelleğe almayı .

Ve Zend Framework'ün DB / Select'inden daha hızlı .


2
adodb, genellikle iyi bir şey olmayan İnce Model / Yağ Kontrolörü lezzetine daha fazla katkıda bulunur.
jblue

ADOdb bir ORM'ye sahiptir (ancak yalnızca bir ORM değildir). Genel olarak gerçekten harika bir çözümdür, DB için Zend'den çok daha iyi çalışır (ADOdb'den daha yavaş olmasının yanı sıra, Zend DB sadece sınırlı JOIN desteğine sahiptir), birçok farklı DB arka ucunun parametrelendirilmesi (Doctrine'den farklı olarak) ile otomatik kaçmayı destekler ve süper kolay memcache entegrasyonu ile güzel genişletilebilir önbellek tasarımına sahiptir. Ben bir "İnce Model / Yağ Kontrolörü" uygulaması için kendini ödünç söylemek doğru olduğunu düşünmüyorum (bunu yapabilir ya da değil, ama ADOdb tasarımı böyle ya da böyle lehine değil).
Iain Collins

3

Kohana için LEAP ORM'a bir göz atın . DB2 , Drizzle , Firebird dahil olmak üzere bir grup veritabanıyla çalışır , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL ve SQLite gibi . Basit bir otomatik yükleme fonksiyonu ile hemen hemen her PHP çerçevesi ile çalışabilir. Kaynak kodu açık GitHub'dan de https://github.com/spadefoot/kohana-orm-leap . LEAP'in eğiticilerini kontrol edebilirsiniz çevrimiçi olarak .

ORM kütüphanesi, tamsayı olmayan birincil anahtarlar ve bileşik anahtarlarla çalışır. Bağlantılar bir veritabanı bağlantı havuzu üzerinden yönetilir ve ham SQL sorguları ile çalışır. ORM bile SQL deyimlerini oluşturmayı süper kolaylaştıran bir sorgu oluşturucuya sahiptir.


2

Kontrol edebilirsiniz Maceraperest hissediyorsanız Repose'a . Gibi Outlet , bu örnek alındı hazırda .

Geliştirilmesinde hala çok erken, ancak şimdiye kadar etki alanı modelindeki tek kısıtlama, sınıfların nihai olarak işaretlenmemesi ve özelliklerin özel olarak işaretlenmemesidir. PHP> = 5.3 alanına girdikten sonra, özel mülkler için de destek uygulamaya çalışacağım.


2

Özellikle Aktif Kayıt yerine Veri Eşleyici paradigmasını uygulayan bir ORM arıyorsanız, GacelaPHP'ye göz atmanızı şiddetle tavsiye ederim .

Gacela özellikleri:

  • Veri eşleyici
  • Yabancı anahtar eşleme
  • İlişkilendirme eşleme
  • Bağımlı haritalama
  • Beton tabla mirası
  • Sorgu nesnesi
  • Meta veri eşleme
  • Tembel ve istekli yükleme
  • Tam Memcached desteği

Diğer ORM çözümleri çok şişirilmiş veya uzaktan karmaşık bir şey geliştirirken külfetli kısıtlamalara sahiptir. Gacela , veritabanı ve Memcached ile yapılan tüm etkileşimler için PDO kullanarak veri eşleme düzenini uygularken veriyi minimumda tutarak aktif kayıt yaklaşımının sınırlamalarını çözmektedir .


2

MicroMVC 13 KB vardır ORM sadece 8 KB dayanır veritabanı sınıfının . Ayrıca tüm sonuçları ORM nesneleri olarak döndürür ve geçerli nesnenin tablosu ve meta verileri hakkında her nesneye bilgi gömülmesini önlemek için geç statik bağlama kullanır. Bu, en ucuz ORM ek yükü ile sonuçlanır.

MySQL , PostgreSQL ve SQLite ile çalışır .



2

Agile Toolkit'in kendi benzersiz ORM / ActiveRecord uygulaması ve dinamik SQL uygulaması vardır .

Giriş: http://agiletoolkit.org/intro/1

Sözdizimi (Aktif Kayıt):

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

Sözdizimi (Dinamik SQL):

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

Dinamik SQL ve Aktif Kayıt / ORM doğrudan kullanılabilirken, Agile Toolkit bunları Kullanıcı Arayüzü ve jQuery UI ile daha da entegre eder . Bu JSF'ye benzer, ancak saf PHP ile yazılmıştır.

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

Bu, Çalışan modeli için AJAXified CRUD görüntüler .


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";
}

2

PDO uzantısı için PHP ORM Yüzleri. Bkz. PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();

1. Site Türkçedir; 2. Kodunuz, örneğin Doktrin ile kullanacağınız koddan farklı bir şey değildir.
Pellmeister


1

Kullandığımız bir diğer harika açık kaynak PHP ORM ise PHPSmartDb . Kararlıdır ve kodunuzu daha güvenli ve temiz hale getirir. İçindeki veritabanı işlevselliği PHP 5.3 ile şimdiye kadar kullandığım en kolay eller aşağı.


1

Doktrin muhtemelen en iyi seçeneğinizdir. Doctrine'den önce, DB_DataObject aslında açık kaynaklı olan diğer tek yardımcı programdı.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.