6

既存の PHP アプリケーションの拡張に取り組んでいます。私にとって残念なことに、既存のアプリはめちゃくちゃです。これはすべて生の mysql_* 呼び出しを含むスパゲッティ コードです。うめき声。私が拡張している部分でそれを行うつもりはありません。

そこで、気軽に立ち寄って使い始められるDBALのシンプルなORMを探しています。望ましい機能:

  • 既存のデータベース スキーマで機能する必要があります。最小限の追加構成を使用するか、追加構成を使用しないことが望ましいです。既存のデータベース スキーマは、既存の PHP コードと同じ品質です (適切な命名規則がない、正規化されていないなど)。Doctrine 2 のように、データベース スキーマを手動で注釈付きオブジェクト プロパティに変換するのに何日も費やしたくありません。
  • 既存の生の mysql_* クエリと一緒に動作できる必要があります。Doctrine 2 や Propel のような水和 ORM が、スクリプトが背後でデータベース内のデータを手動で操作しているときにどのように動作するかはわかりませんが、きれいではないと思います。
  • PHP 5.2.x で実行する必要があります。私は PHP 5.3 を使いたいと思っいますが、既存の 125,000 行のスパゲッティ コードの混乱を調べて、PHP 5.3 で動作することを確認することにまったく関心がありません。
  • 関係は必要ありません。リレーショナル データにアクセスする必要があるいくつかの場所では、喜んでエクストラなどを呼び出しfind()ますquery()
  • beforeSave何らかのトリガー サポート ( 、 など)があればボーナス ポイントafterSave。必須ではありませんが、あると便利です。

編集:誰かが私を悲惨な状態から解放してくれました。125,000 行のスパゲッティ コードがデータベース スキーマも変更することがわかりました。たとえば、どこかに追加のオプションを追加すると、大量の ALTER TABLE ステートメントが飛んでいきます。おそらく、このコードベースで 1 年分の TheDailyWTF を埋めることができるでしょう。したがって、もう 1 つの要件:

  • データベース スキーマの変更に自動的に対応できる必要があります (列の追加など)。

いくつかのソリューションを検討してきましたが、要件を考慮してどれだけうまく機能するかはわかりません。Doctrine 2、RedBeanPhp などはすべて PHP 5.3 を必要とするため、アウトです。PHP 5.2.x 用の RedBeanPhp のレガシー バージョンがありますが、それが乱雑な既存のデータベース スキーマで機能するかどうかはわかりません。NotORM はデータを取得するのに問題ないように見えますが、既存のデータベース スキーマ用に構成できるかどうか、およびデータをデータベースに簡単に戻す方法がわかりません。

理想的には、シンプルなものが欲しいです。例えば:

$user = User::find($id);
$user->name = 'John Woo';
$user->save();

または:

$articles = ORM::find('article')->where('date' => '2010-01-01');
foreach ($articles as $article) {
    echo $article->name;
}

ヒントや代替ソリューションも大歓迎です!

4

2 に答える 2

11

私は使用しています... http: //github.com/j4mie/idiorm/

パリの形でもアクティブレコードの実装があります。

あなたの編集に関して。Idiormはスキーマの変更に対応し、構文は質問で必要なタイプとほぼ完全に一致します。

于 2011-01-18T10:03:58.017 に答える
1

Doctrine をどの程度調べましたか? 私はDoctrine 1.2をこれらの種類のものに使用しています. セットアップが非常に簡単で、既存のスキーマから始めることができます。外部キー制約を持つテーブル間の関係を自動的に把握します。

広範なトリガーと動作のサポートがあるため、ボーナス ポイントも使用できます。また、リレーショナル サポートも備えているため、追加のクエリは必要ありません。それは美しい遅延読み込みを備えており、わずかな労力で SQL で実行できるのとほぼ同じことを実行できる柔軟なクエリ言語 (DQL と呼ばれる) が付属しています。

例は次のようになります。

/* To just find one user */
$user = Doctrine::getTable('User')->findOneById($id);

/* Alternative - illustrating DQL */
$user = Doctrine_Query::create()
    ->from('User u')
    ->where('u.id = ?',array($id))
    ->fetchOne();

$user->name = 'John Woo';
$user->save();

既存の生の mysql_* クエリと一緒に動作できる必要があります。Doctrine 2 や Propel のような水和 ORM が、スクリプトが背後でデータベース内のデータを手動で操作しているときにどのように動作するかはわかりませんが、きれいではないと思います。

まあ、それを自動管理することは技術的に不可能です。SQL データベースは単純に ORM にプッシュバックしていないため、バックグラウンドで変更されたものを更新するには、何らかの方法で追加のクエリを実行する必要があります。幸いなことに、Doctrine はこれをとても簡単にしてくれます:

/* @var User $user */
/* Change a user using some raw mysql queries in my spaghetti function */
$this->feedSpaghetti($user->id);

/* Reload changes from database */
$user->refresh();
于 2011-01-18T10:26:17.683 に答える