Perpustakaan PHP ORM yang Baik?

268

Apakah ada perpustakaan pemetaan objek-relasional-baik untuk PHP?

Saya tahu PDO / ADO, tetapi mereka tampaknya hanya memberikan perbedaan abstrak antara vendor database bukan pemetaan aktual antara model domain dan model relasional. Saya mencari perpustakaan PHP yang fungsinya mirip dengan cara Hibernate untuk Java dan NHibernate untuk .NET.

Peter Mortensen
sumber

Jawaban:

103

Coba RedBean , ini membutuhkan:

  • Tidak ada konfigurasi
  • Tidak ada basis data (ini menciptakan semuanya dengan cepat)
  • Tidak ada model
  • dll.

Bahkan melakukan semua penguncian dan transaksi untuk Anda dan memantau kinerja di latar belakang. (Heck! Bahkan pengumpulan sampah ....) Yang terbaik ... Anda tidak perlu menulis satu baris kode ... Ya Tuhan , ini lapisan ORM , selamatkan saya!

jnewman
sumber
9
redbean adalah tangan ke bawah lapisan abstraksi database terbaik yang pernah saya kerjakan. bukan "salah satu yang terbaik" - yang terbaik.
Nir Gavish
Temuan yang sangat bagus. Saya sangat terkesan dengan ORM ini untuk sedikitnya
Christopher Tarquini
1
Bandingkan RedBean dengan Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... yesus saya membaca bagian pertama dari dokumentasi dan itu membuat saya membuat tawa diktator yang menyeramkan, dan saya sudah mengunduhnya!
KJW
45

Hanya ada dua yang bagus: Ajaran dan Propel . Kami mendukung Doktrin, dan itu bekerja dengan baik dengan Symfony . Namun jika Anda mencari dukungan database selain yang utama Anda harus menulis kode Anda sendiri.

Peter Mortensen
sumber
Propel cukup bagus menurut standar php. Ini menghasilkan kode yang cukup bersih yaitu IDE friendly dengan getter dan setter dan sistem abstraksi Kriteria yang sangat bersih untuk query.
0x6A75616E
Karena pertanyaan ini terhubung sedikit di sekitar SO, saya ingin menunjukkan bahwa Propel adalah proyek yang dihentikan pada tahun 2020. Kompatibilitas PHP7 tidak pernah diterapkan. Jadi memilih Propel sebagai ORM untuk proyek perangkat lunak baru pada tahun 2020 bukanlah ide yang baik.
mrodo
34

Axon ORM adalah bagian dari Kerangka Kerja Bebas Lemak - ia memiliki mapper on-the-fly. Tidak ada pembuat kode. Tidak ada XML / YAML yang bodoh file konfigurasi . Bunyinya skema database langsung dari backend, jadi di sebagian besar operasi CRUD Anda bahkan tidak perlu memperpanjang model dasar. Ia bekerja dengan semua mesin basis data utama yang didukung PDO : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL , dll.

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

Yang terpenting, plug-in dan layer akses data SQL yang menyertainya hanya seringan kerangka: 14 KB (Axon) + 6 KB (SQLdb). Bebas Lemak hanya 55 KB.

tetap
sumber
15
Itu selalu membuatku khawatir ketika aku melihat sesuatu seperti $product->load('product_id=123')dalam contoh.
Znarkus
9
untuk paranoid, sintaks alternatifnya adalah$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
4
Fat-Free juga memiliki ORS NoSQL untuk file MongoDB dan flat
bcosca
28

Saya telah mengembangkan Pork.dbObject sendiri. (Implementasi PHP ORM sederhana dan Rekaman Aktif) Alasan utamanya adalah saya merasa sebagian besar ORM terlalu berat.

Pikiran utama Pork.dbObejct adalah menjadi ringan dan mudah diatur. Tidak ada banyak file XML, hanya satu panggilan fungsi dalam konstruktor untuk mengikatnya, dan addRelation atau addCustomRelation untuk menentukan hubungan ke dbObject lain.

Coba lihat: Pork.dbObject

SchizoDuckie
sumber
1
Saya mencari implementasi PHP ORM yang ringan hari ini, dan menemukan Pork.dbObject berkat posting ini. Ini sangat bagus! +1
E Dominique
6
Duude! Ini sangat menarik. Saya melihat bahwa pembaruan terbaru terjadi di suatu tempat di '09. Apakah ini masih dipertahankan? Jika tidak ... Saya mungkin menghidupkannya kembali :)
VladFr
22

Mencoba Doctrine2 . Ini mungkin alat ORM paling kuat untuk PHP. Saya menyebutkannya secara terpisah dari Doctrine 1, karena ini adalah perangkat lunak yang sangat berbeda. Sudah ditulis ulang dari awal, masih dalam tahap beta, tetapi sekarang dapat digunakan dan dikembangkan.

Ini adalah ORM yang sangat kompleks, tetapi dirancang dengan baik. Banyak sihir dari Doktrin 1 asli menghilang. Ini memberikan solusi yang lengkap, dan Anda dapat menulis ORM Anda sendiri di atas Doctrine2 atau hanya menggunakan salah satu lapisannya .

tomp
sumber
Satu-satunya masalah yang dapat saya pikirkan dengan Doctrine2 adalah bahwa itu tergantung pada PHP 5.3 dan lebih tinggi.
jblue
8
@ jblue: Ini bukan masalah, itu fitur ;-). Perpustakaan besar seperti Doctrine membutuhkan ruang nama.
Tom Pažourek
"Banyak sihir dari Doktrin 1 asli menghilang." - Dalam hal apa ini positif?
Olivier 'Ölbaum' Scherler
13

Saya baru saja mulai dengan Kohana , dan tampaknya yang paling dekat dengan Ruby on Rails tanpa melibatkan semua kompleksitas beberapa file konfigurasi seperti dengan Propel .

Zak
sumber
Saya juga setuju bahwa Kohana adalah kerangka kerja yang paling mirip dengan RoR di dunia PHP. Yang hilang hanyalah perancah, dan dengan dukungan CLI di KO3, hanya masalah seseorang yang menyingsingkan lengan baju mereka dan melakukannya.
Phillip Whelan
12

Lihat Outlet ORM . Ini lebih sederhana daripada Propel dan Doctrine dan kerjanya mirip dengan Hibernate, hanya dengan PHP yang lebih terasa.

Alvaro
sumber
3
Saya mencoba ini. Saya harus menentukan properti objek yang sama di 3 tempat - konfigurasi, model dan skema database. Itu banyak pekerjaan untuk menerapkan IMO ORM.
mixdev
Outlet sangat berat konfigurasi.
Lotus Notes
Saya sudah mencoba ini (1.0 RC1) dan itu sangat buggy bahkan di core fungsionalitty. Dan ya, ada banyak konfigurasi untuk ditulis. Saya tidak merekomendasikannya.
Szymon Wygnański
11

Saya sangat suka Propel , di sini Anda bisa mendapatkan gambaran umum, dokumentasinya cukup bagus, dan Anda bisa mendapatkannya melalui PEAR atau SVN.

Anda hanya perlu menginstal PHP5 yang berfungsi, dan Phing untuk mulai membuat kelas.

CMS
sumber
Propel juga dapat 'merekayasa balik' skema database yang ada - membuat objek PHP dari membaca skema database.
David Goodwin
8

Saya menemukan kelas terkait ORM di perpustakaan PHP Berkembang .

VDVLeon
sumber
6

Berikan kesempatan pada dORM, sebuah mapper relasional objek untuk PHP 5 . Ini mendukung semua jenis hubungan (1-ke-1), (1-ke-banyak), (banyak-ke-banyak) dan tipe data. Ini benar-benar tidak mengganggu: tidak ada pembuatan kode atau perluasan kelas yang diperlukan. Menurut saya itu lebih unggul daripada ORM di luar sana, termasuk Ajaran dan Propel. Namun, ini masih dalam versi beta dan mungkin akan berubah secara signifikan dalam beberapa bulan ke depan. http://www.getdorm.com

Ini juga memiliki kurva belajar yang sangat kecil. Tiga metode utama yang akan Anda gunakan adalah:

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

Saat ini saya sedang mengerjakan phpDataMapper , yang merupakan ORM yang dirancang untuk memiliki sintaks sederhana seperti proyek Datamapper Ruby. Ini masih dalam pengembangan awal, tetapi ini bekerja dengan baik.

Vance Lucas
sumber
4

Saya memiliki pengalaman hebat dengan Idiorm dan Paris . Idiorm adalah perpustakaan ORM kecil dan sederhana. Paris adalah implementasi Rekaman Aktif yang sama sederhananya yang dibangun di atas Idiorm. Ini untuk PHP 5.2+ dengan PDO. Ini sempurna jika Anda menginginkan sesuatu yang sederhana yang dapat Anda masukkan ke dalam aplikasi yang sudah ada.

Sander Marechal
sumber
4

Mencoba ORM dari perpustakaan Flourish .

eaguilar
sumber
Ya, saya telah bekerja dengannya selama beberapa waktu. The flourishlib memang hebat, tetapi ORM masih memiliki beberapa pekerjaan yang harus dilakukan. Bekerja dengan menggabungkan tabel yang memiliki properti tambahan atau kunci asing, membuat objek baru bisa sedikit membosankan. Bekerja dengan model sederhana sangat mudah. Lihatlah ORM Orde atau Outlet untuk ORM alternatif untuk PHP.
Michael
3

Sampai rilis PHP 5.3 jangan berharap memiliki ORM yang baik. Ini adalah batasan OO untuk PHP.

knoopx
sumber
Jadi bagaimana PHP 5.3 membantu seseorang menulis ORM yang lebih baik? Saya tidak melihat alasan.
Ionuț G. Stan
8
alasan utama adalah pengenalan akhir statis yang mengikat (kata kunci "statis"). baca tentang itu di blog.felho.hu/…
knoopx
2
ORM tidak benar-benar membutuhkan variabel statis, mereka dapat dirancang dengan baik menggunakan variabel instan saja.
Tom Pažourek
Benar, keterlambatan pengikatan statis adalah alasan saya bisa mendapatkan setiap instance ORM dari ORM saya sendiri sangat rendah . Sebelum pengikatan statis terlambat, pemborosan ini sama borosnya dengan yang lainnya.
Xeoncross
3

Teman saya Kien dan saya telah memperbaiki versi ORM sebelumnya yang telah ditulisnya sebelum PHP 5.3. Kami pada dasarnya telah porting melalui Ruby on Rails ' Record Aktif ke PHP. Masih kekurangan beberapa fitur utama yang kita inginkan seperti transaksi, dukungan kunci primer komposit, beberapa adapter (hanya MySQL dan SQLite 3 yang berfungsi saat ini). Tapi, kami sangat dekat untuk menyelesaikan hal ini. Anda dapat melihat di PHP ActiveRecord dengan PHP 5.3 .

Jacques Fuentes
sumber
3

Coba PHP ADOdb.

Saya tidak bisa mengatakan itu yang terbaik, karena saya belum pernah menggunakan yang lain. Tapi itu cepat, ini mendukung Memcached dan caching.

Dan itu waaaay lebih cepat dari DB / Select Zend Framework .

Peter Mortensen
sumber
2
adodb lebih cocok untuk rasa Thin Model / Fat Controller, yang umumnya bukan hal yang baik.
jblue
ADOdb memiliki ORM (tetapi bukan hanya ORM). Ini adalah solusi yang sangat bagus secara umum, ia bekerja jauh lebih baik daripada Zend untuk DB (dan juga lebih lambat dari ADOdb, Zend DB hanya memiliki dukungan GABUNG terbatas), ia mendukung pelolosan otomatis dengan parameterisasi (tidak seperti doktrin) banyak backend DB dan memiliki desain caching yang dapat diperpanjang yang bagus dengan integrasi memcache yang super mudah. Saya tidak berpikir itu sama sekali akurat untuk mengatakan itu cocok untuk implementasi "Thin Model / Fat Controller" (Anda dapat melakukannya atau tidak, tetapi desain ADOdb tidak mendukung satu atau lain cara).
Iain Collins
3

Lihatlah ORANG LEAP untuk Kohana . Ia bekerja dengan sekelompok database, termasuk DB2 , Gerimis , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL , dan SQLite . Dengan fungsi pengisian otomatis yang sederhana, ini dapat bekerja dengan hampir semua kerangka kerja PHP. Kode sumber ada di GitHub di https://github.com/spadefoot/kohana-orm-leap . Anda dapat memeriksa tutorial LEAP secara online.

Perpustakaan ORM bekerja dengan kunci primer non-integer dan kunci komposit. Koneksi dikelola melalui kumpulan koneksi basis data dan berfungsi dengan kueri SQL mentah. ORM bahkan memiliki pembangun kueri yang membuat pembuatan pernyataan SQL menjadi sangat sederhana.

Matius
sumber
2

Anda dapat melihat Istirahat jika Anda ingin berpetualang. Seperti Outlet , dimodelkan setelah Hibernate .

Ini masih sangat awal dalam pengembangannya, tetapi sejauh ini satu-satunya batasan pada model domain adalah bahwa kelas tidak ditandai sebagai final dan properti tidak ditandai pribadi. Begitu saya masuk ke tanah PHP> = 5.3, saya akan mencoba menerapkan dukungan untuk properti pribadi juga.

Beau Simensen
sumber
2

Jika Anda mencari ORM yang mengimplementasikan paradigma Data Mapper daripada Rekaman Aktif secara spesifik, maka saya sangat menyarankan agar Anda melihat GacelaPHP .

Fitur Gacela:

  • Pemeta data
  • Pemetaan kunci asing
  • Pemetaan asosiasi
  • Pemetaan dependen
  • Warisan tabel beton
  • Objek kueri
  • Pemetaan metadata
  • Pemuatan malas & bersemangat
  • Penuh memcached dukungan

Solusi ORM lainnya terlalu membengkak atau memiliki keterbatasan memberatkan ketika mengembangkan sesuatu yang jauh rumit. Gacela mengatasi keterbatasan pendekatan rekaman aktif dengan menerapkan Pola Data Mapper sambil menjaga mengasapi agar tetap minimum dengan menggunakan PDO untuk semua interaksi dengan database dan Memcached.

Noah Goodrich
sumber
2

MicroMVC memiliki ORM 13 KB yang hanya mengandalkan kelas basis data 8 KB . Ini juga mengembalikan semua hasil sebagai objek ORM sendiri dan menggunakan pengikatan statis akhir untuk menghindari penyematan informasi tentang tabel objek saat ini dan data meta ke dalam setiap objek. Ini menghasilkan overhead ORM termurah yang ada.

Ia bekerja dengan MySQL , PostgreSQL , dan SQLite .

Peter Mortensen
sumber
2

ORM Brasil: http://www.hufersil.com.br/lumine . Ini bekerja dengan PHP 5.2+. Menurut pendapat saya, ini adalah pilihan terbaik untuk orang-orang Portugis dan Brasil, karena memiliki dokumentasi yang mudah dipahami dan banyak contoh untuk diunduh.

Paulo Araujo
sumber
2

Agile Toolkit memiliki implementasi unik dari ORM / ActiveRecord dan SQL dinamis .

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

Sintaks (Rekaman Aktif):

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

Sintaks (SQL Dinamis):

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

Sementara Dynamic SQL dan Active Record / ORM dapat digunakan secara langsung, Agile Toolkit lebih lanjut mengintegrasikannya dengan User Interface dan UI jQuery . Ini mirip dengan JSF tetapi ditulis dalam PHP murni.

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

Ini akan menampilkan AJAXified CRUD dengan untuk model Karyawan.

romaninsh
sumber
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
sumber
2

PHP ORM Faces Untuk ekstensi PDO. Lihat Kerangka Wajah PHP .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Kurt
sumber
1. Situs adalah Turki; 2. Kode Anda tidak berbeda dengan kode yang akan Anda gunakan dengan mis. Doctrine.
The Pellmeister
1

Lihatlah http://code.google.com/p/lworm/ . Ini adalah sistem ORM yang sangat sederhana, tetapi kuat, ringan untuk PHP. Anda juga dapat dengan mudah memperpanjangnya, jika diinginkan.

Faz
sumber
1

PHP ORM open source hebat lain yang kami gunakan adalah PHPSmartDb . Itu stabil dan membuat kode Anda lebih aman dan bersih. Fungsi basis data di dalamnya adalah yang paling mudah yang pernah saya gunakan dengan PHP 5.3.

Joe
sumber
1

Doktrin mungkin merupakan taruhan terbaik Anda. Sebelum Doctrine, DB_DataObject pada dasarnya adalah satu-satunya utilitas lain yang bersumber terbuka.

anon
sumber
1

Jika Anda mencari ORM, seperti Hibernate , Anda harus melihat PMO .

Ini dapat dengan mudah diintegrasikan dalam arsitektur SOA (hanya ada kelas layanan web untuk dikembangkan).

anonim
sumber