既存のPHPアプリには簡単なORMまたはDBALが必要です
質問
既存のPHPアプリケーションの拡張に取り組んでいます。私にとって残念なことに、既存のアプリは混乱しています。それはすべて、生のmysql_*呼び出しを使用したすべてのスパゲッティコードです。うめき声。私が拡張している部分でそれをするつもりはありません。
だから、私は簡単に立ち寄って使用を開始できるDBALの単純なORMを探しています。望ましい機能:
- 既存のデータベーススキーマで動作する必要があります。できれば最小限または追加の構成がない。既存のデータベーススキーマは、既存のPHPコードと同じ品質です(賢明な命名規則はありませんが、正規化されていません)。データベーススキーマを手動で注釈付きのオブジェクトプロパティに変換することを何日も費やしたくありません2。
- 既存の生のmysql_*クエリと一緒に作業できる必要があります。スクリプトが背中の背後にあるデータベースのデータを手動で操作している場合、Doctrine 2やPropelのようなHydrating Ormがどのように振る舞うかはわかりませんが、それはきれいではないと思います。
- PHP 5.2.xで実行する必要があります。私は 愛 PHP 5.3を使用するには、既存の125KラインのSpaghetti Code Messを介してPHP 5.3で実行されることを確認することに興味がありません。
- 関係は必要ありません。リレーショナルデータに到達する必要があるいくつかの場所で、私は喜んで余分に電話します
find()
またquery()
または自分自身は何でも。 - トリガーサポートがある場合(例:
beforeSave
,afterSave
)。要件ではありませんが、持っているのはいいことです。
編集: :誰かが私の悲惨さから私を追い出しました。 Spaghettiコードの125k行もデータベーススキーマを変更することがわかりました。たとえば、どこかに追加のオプションを追加し、さまざまなテーブルステートメントが飛行を開始します。おそらく、このコードベースで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;
}
どんなヒントや代替ソリューションも大歓迎です!
解決
私が使う...http://github.com/j4mie/idiorm/
パリの形でもアクティブなレコード実装があります。
編集に関して。イディオームは変化するスキーマに対処し、構文はあなたの質問に必要なタイプとほぼ正確に一致します。
他のヒント
教義をどれだけよく調べましたか?私はこうした種類のことに教義1.2を使用しています。セットアップが非常に簡単で、既存のスキーマから始めることができます。外部のキーの制約があるテーブル間の関係を自動的に把握します。
広範なトリガーと動作サポートがあるため、ボーナスポイントも使用でき、リレーショナルサポートもあるため、追加のクエリは必要ありません。美しい怠zyな読み込みがあり、柔軟なクエリ言語(DQLと呼ばれる)が付属しており、SQLでできるのとほんの数分の1の努力とほぼ同じことを行うことができます。
あなたの例は次のようになります:
/* 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のようなHydrating Ormがどのように振る舞うかはわかりませんが、それはきれいではないと思います。
まあ、それは技術的に自動管理することは不可能です。 SQLデータベースは単にORMに物を押し戻すだけではないため、バックグラウンドで変更されたものを更新するには、どちらかを追加する必要があります。幸いなことに、ドクトリンはこれをあなたにとって非常に簡単にします:
/* @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();