良いPHP ORMライブラリ?


268

PHPに適したオブジェクトリレーショナルマッピングライブラリはありますか?

私はPDO / ADO を知っていますが、ドメインモデルとリレーショナルモデル間の実際のマッピングではなく、データベースベンダー間の違いの抽象化のみを提供しているようです。私は、HibernateがJavaに対して、NHibernateが.NETに対して行うのと同様に機能するPHPライブラリを探しています。

回答:



103

RedBeanを試してください。

  • 設定なし
  • データベースなし(すべてを即座に作成)
  • モデルなし

さらに、すべてのロックとトランザクションを実行し、バックグラウンドでパフォーマンスを監視します。(ヘック!ガベージコレクションも実行します。...)何よりも... 1行のコードを書く必要はありません...コード行...イエスこれORMレイヤーは、私を助けてくれました!


9
redbeanは、私が今まで使った中で最高のデータベース抽象化レイヤーです。「最高の1つ」ではなく、最高です。
Nir Gavish、2010

とても素敵な発見。私は控えめに言ってもこのORMに非常に感銘を受けました
Christopher Tarquini



3
+1 +1 +1 +!+!!!!! ...イエス私はドキュメントの最初の部分を読み、それが不吉な独裁者を笑わせました、そして私はすでにそれをダウンロードしています!
KJW 2012年

45

DoctrinePropelの 2つだけ良いものがあります。私たちはDoctrineを支持しており、それはSymfonyでうまく動作します。ただし、主要なサポート以外のデータベースサポートを探している場合は、独自のコードを記述する必要があります。


PropelはPHP標準ではかなり良いです。それはゲッターとセッターと非常にクリーンなコードを生成し、クエリのための非常にクリーンなCriteria抽象化システムです。
0x6A75616E 2011

この質問はSOにかなり関連しているため、Propelは2020の時点で廃止されたプロジェクトであることを指摘したいと思います。PHP7互換性は実装されていません。したがって、2020年に新しいソフトウェアプロジェクトのORMとしてPropelを選択することは良い考えではありません。
mrodo

34

Axon ORMはFat-Free Frameworkの一部です-オンザフライマッパーを備えています。コードジェネレータはありません。愚かなXML / YAML構成ファイルは。データベーススキーマをバックエンドから直接読み取るため、ほとんどのCRUD操作では、ベースモデルを拡張する必要すらありません。MySQLSQLiteSQL Server / Sybase、Oracle、PostgreSQLなど、すべての主要なPDO対応データベースエンジンで動作します。

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

とりわけ、プラグインと付随するSQLデータアクセスレイヤーは、フレームワークと同じくらい軽量です(14 KB(軸索)+ 6 KB(SQLdb))。Fat-Freeはわずか55 KBです。


15
$product->load('product_id=123')例のようなものを見るといつも心配です。
Znarkus

9
偏執狂の場合、代替構文は次のとおりです$product->load(array('product_id=:id',array(':id'=>123)));
。– bcosca

4
Fat-Freeには、MongoDBとフラットファイル用のNoSQL
ORM

28

私は自分でPork.dbObjectを開発しています。(単純なPHP ORMとActive Recordの実装)主な理由は、ほとんどのORMが重すぎるということです。

Pork.dbObejctの主な考えは、軽量でセットアップが簡単であることです。XMLファイルの束はなく、それをバインドするためのコンストラクター内の1つの関数呼び出しと、別のdbObjectとの関係を定義するためのaddRelationまたはaddCustomRelationだけです。

見てみましょう:Pork.dbObject


1
今日、軽量のPHP ORM実装を探していたところ、この投稿のおかげでPork.dbObjectが見つかりました。それはうまくいきます!+1
E Dominique

6
おい!これはかなり興味深いです。最新のアップデートは'09のどこかで行われたようです。これはまだ維持されていますか?そうでなければ...私はそれを復活させるかもしれません:)
VladFr

22

試す Doctrine2を。これはおそらく、PHPの最も強力なORMツールです。完全に異なるソフトウェアであるため、Doctrine 1とは別に言及します。ゼロから書き直され、まだベータ段階ですが、現在使用可能で開発されています。

これは非常に複雑なORMですが、うまく設計されています。元のDoctrine 1の多くの魔法が消えました。それは完全なソリューションを提供し、Doctrine2の上に独自のORMを書くか、そのレイヤーの 1つだけを使用できます


Doctrine2で私が考えることができる唯一の問題は、それがPHP 5.3以上に依存していることです。
jblue

8
@jblue:問題ではなく、機能です;-)。Doctrineのような大きなライブラリには名前空間が必要です。
TomPažourek10年

「元のDoctrine 1の多くの魔法が消えました。」—このポジティブな点は何ですか?
Olivier 'Ölbaum' Scherler 2011

13

私はコハナから始めたばかりですが、Propelのように複数の構成ファイルの複雑さをすべて呼び出すことなく、Ruby on Railsに最も近いようです。


また、コハナがPHPの世界でRoRに最も類似しているフレームワークであることにも同意します。それが足りないのは足場であり、KO3でのCLIサポートでは、誰かが袖をまくってそれを行うだけの問題です。
Phillip Whelan、

12

アウトレットORMをチェックしてください。これは、PropelやDoctrineよりもシンプルで、Hibernateと同じように機能しますが、より多くのPHPの感触があります。


3
私はこれを試しました。同じオブジェクトのプロパティを3つの場所(構成、モデル、データベーススキーマ)で指定する必要がありました。これは、ORM IMOを実装するための多くの作業です。
mixdev

コンセントは非常に設定が重いです。
Lotus Notes

私はこれ(1.0 RC1)を試しましたが、コア機能においても非常にバグが多かったです。そして、はい、多くの設定を書く必要があります。お勧めしません。
SzymonWygnański、2011

11

私は本当にPropelが好きです、ここで概要を得ることができます、ドキュメントはかなり良いです、そしてあなたはPEARまたはSVNを通してそれを得ることができます。

PHP5をインストールして、クラスの生成を開始するにはPhingが必要です。


Propelは既存のデータベーススキーマを「リバースエンジニアリング」することもできます-データベーススキーマの読み取りからPHPオブジェクトを作成します。
David Goodwin



6

PHP 5のオブジェクトリレーショナルマッパーであるdORM試しください。あらゆる種類の関係(1対1)、(1対多)、(多対多)、およびデータ型をサポートしています。それは完全に控えめです:コード生成またはクラス拡張は必要ありません。私の意見では、DoctrineとPropelを含め、他のORMよりも優れています。ただし、まだベータ版であり、今後数か月で大幅に変更される可能性があります。http://www.getdorm.com

また、学習曲線も非常に小さくなっています。使用する主な3つの方法は次のとおりです。

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


4

私はイディオムとパリで素晴らしい経験をしました。Idiormは小さくてシンプルなORMライブラリです。Parisは、Idiorm上に構築された同様にシンプルなActive Record実装です。PDOを使用するPHP 5.2以降用です。既存のアプリケーションにドロップするだけの簡単なものが必要な場合に最適です。


4

はい、私はしばらくそれを使ってきました。flourishlibは素晴らしいですが、ORMにはまだやるべきことがいくつかあります。追加のプロパティまたは外部キーを持つ結合テーブルを使用して、新しいオブジェクトを作成するのは少々面倒です。単純なモデルでの作業は簡単です。PHPの代替ORMについては、Repose ORMまたはOutletをご覧ください。
Michael

3

PHP 5.3リリースまでは、優れたORMが期待できません。これは、PHPのオブジェクト指向の制限です。


では、PHP 5.3は、より優れたORMを作成するのにどのように役立つでしょうか。理由は分からない。
Ionuț G. Stan

8
主な理由は、遅延静的バインディング(「静的」キーワード)の導入です。blog.felho.hu/…で
knoopx

2
ORMは実際には静的変数を必要とせず、インスタンス変数のみを使用して適切に設計できます。
TomPažourek

確かに、レイトスタティックバインディングが自分の各ORMインスタンスを取得できる理由です。 のORMの非常に低くです。スタティックバインディングが遅くなる前は、他のほとんどと同じように無駄がありました。
Xeoncross

3

私の友人であるKienと私は、彼がPHP 5.3以前に作成したORMの以前のバージョンを改良しました。基本的に、Ruby on RailsのActive RecordをPHPに移植しました。トランザクション、複合主キーのサポート、いくつかのアダプターなど、私たちが必要とするいくつかの主要な機能がまだ不足しています(現在、MySQLとSQLite 3のみが機能します)。しかし、私たちはこれを仕上げるところです。PHP 5.3PHP ActiveRecordを見ることができます。


3

PHP ADOdbを試してください。

他を使ったことがないので最高とは言えません。しかし、それは高速で、Memcachedをサポートしていますとキャッシングを。

また、Zend Frameworkの DB / Select よりも高速です。


2
adodbは、シンモデル/ファットコントローラーフレーバーに適していますが、これは一般に良いことではありません。
jblue

ADOdbにはORMがあります(ただし、単なるORMではありません)。それは一般的に本当に素晴らしいソリューションです、それはZendがDBに対して行うよりもはるかによく機能し(そしてADOdbよりも遅く、Zend DBはJOINのサポートに制限があります)、多くの異なるDBバックエンドとパラメーター化(たとえば、Doctrineとは異なり)で自動エスケープをサポートします非常に簡単なmemcache統合を備えた、拡張可能な優れたキャッシング設計を備えています。「シンモデル/ファットコントローラー」の実装に適していると言うのはまったく正確ではないと思います(それが可能かどうかは問題ありませんが、ADOdbの設計はどちらか一方を支持していません)。
Iain Collins

3

コハナLEAP ORMをご覧くださいDB2DrizzleFirebirdMariaDB、SQL Server、MySQL、Oracle、PostgreSQLなどの一連のデータベースで動作します、およびSQLiteの。シンプルなオートロード機能により、ほぼすべてのPHPフレームワークで動作します。ソースコードは、上にあるのGitHubhttps://github.com/spadefoot/kohana-orm-leapLEAPのチュートリアルをチェックアウトできますオンラインでます。

ORMライブラリは、整数以外の主キーと複合キーで機能します。接続はデータベース接続プールを介して管理され、生のSQLクエリで機能します。ORMには、SQLステートメントの構築を非常に簡単にするクエリビルダーもあります。


2

冒険したい場合は、休息をチェックしてください。Outletと同様に、Hibernateをモデルにしていますます。

それはまだ開発の非常に早い段階ですが、これまでのところドメインモデルに対する唯一の制限は、クラスが最終としてマークされておらず、プロパティがプライベートとしてマークされていないことです。PHP> = 5.3の領域に入ったら、プライベートプロパティのサポートも実装しようとします。


2

特にActive RecordではなくData Mapperパラダイムを実装するORMを探している場合は、GacelaPHPを参照することを強くお勧めします。

ガセラの特徴:

  • データマッパー
  • 外部キーのマッピング
  • 関連付けマッピング
  • 依存マッピング
  • 具体的なテーブル継承
  • クエリオブジェクト
  • メタデータのマッピング
  • レイジー&イーガーローディング
  • Memcachedの完全サポート

その他のORMソリューションは、肥大化しすぎたり、リモートで複雑なものを開発するときに厄介な制限があります。Gacelaは、データベースとMemcachedとのすべてのやり取りにPDOを使用して膨張を最小限に抑えながら、データマッパーパターンを実装することにより、アクティブレコードアプローチの制限を解決します。


2

MicroMVCには、8 KBのデータベースクラスのみに依存する13 KBのORMがあります。また、すべての結果をORMオブジェクト自体として返し、レイトスタティックバインディングを使用して、現在のオブジェクトのテーブルとメタデータに関する情報を各オブジェクトに埋め込むのを回避します。これにより、ORMオーバーヘッドが最も安価になります。

MySQLPostgreSQLSQLiteで動作します


2

ブラジルのORM:http : //www.hufersil.com.br/lumine。PHP 5.2以降で動作します。私の意見では、理解しやすいドキュメントとダウンロード用の多くの例があるため、ポルトガル語とブラジルの人々にとって最良の選択です。


2

Agile Toolkitには、ORM / ActiveRecordおよび動的SQLの独自の実装があります

はじめに:http : //agiletoolkit.org/intro/1

構文(アクティブレコード):

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

構文(動的SQL):

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

動的SQLとActive Record / ORMは直接使用できますが、Agile ToolkitはさらにそれらをユーザーインターフェイスおよびjQuery UIと統合します。これはJSFに似ていますが、純粋なPHPで書かれています。

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

これにより、従業員モデル用のAJAX化CRUDが表示されます。


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



1

私たちが使用しているもう1つの優れたオープンソースのPHP ORMは、PHPSmartDbです。安定しており、コードをより安全でクリーンにします。その中のデータベース機能は、私がPHP 5.3で使用した最も簡単な方法です。


1

Doctrineはおそらくあなたの最善の策です。Doctrine以前は、DB_DataObjectは本質的にオープンソースであった唯一の他のユーティリティでした。


1

HibernateなどのORMを探している場合は、PMOを確認する必要があります。

SOAアーキテクチャに簡単に統合できます(開発するWebサービスクラスだけがあります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.