職場では、私自身のORM'ka制作に直面しなければなりませんでした。 彼は自分でやるようになりました(まあ、愚か者ではないでしょうか?)。3日後、型を制御せずにオブジェクトのテーブルの構造を表示する簡単なORMを手に入れました。 結果は次のようになります。
- データベースクラス(mysqliから継承、pdoは使用できませんでした)
- dbを格納し、CRUDレコードを処理するテーブルクラス
- CUDメソッドをテーブルクラスにリダイレクトする書き込みクラス
おおよその使用:
<code class = "php"> $ table = new ArticleTable();
$ record = $ table-> fetchOneWhere( "slug = 'hello'"); //既存のエントリを取得します
$ record-> name = 'Fucking Article!';
$ record-> save(); //これが新しいレコードかどうかに応じて、挿入/更新を呼び出します
$ record = $ table-> create(); //新しいレコードを作成します
$ record-> name = 'Fucking Article2!';
$ record-> slug = 'fucking_article';
// ...
$ record-> save(); </ code>
そして、Zend_Db:Zend_Db_Table / Zend_Db_Table_Rowのようなものが非常に思い出されました。 考え直すことなく、システムnafigを投げてZend Frameworkの一部をプロジェクトにアップロードし(必要に応じて、Zend_Dbコンポーネント全体が正しく機能するために必要なファイルを教えます)、このZend_Dbの内容を読むことも決定しましたが、 、判明したとおり-非常に多く:
- obdでの作業の優れた抽象化
- レコード/テーブルクラス
- 関連オブジェクトの取得のサポート
- 多対多の関係のサポート(Propelにもこれはありません)
実際、自動的に機能するように追加できるものがまだあります。
- テーブルフィールドタイプに応じたバリデーター
- 複数のテーブルからデータをすぐに取得する機能(正確には、そのようなデータを取得するのは非常に簡単ですが、別のオブジェクトに分散してこれらのオブジェクトをリンクすることは、間違っていない場合はハンドルで行う必要がありますが、これは問題ではありません)
すべてが好きです。 全体的な印象は素晴らしいシステムです。 使用は簡単で快適です。 :)
例:レイヤーの私のスーパータイプが最初に移動します(
EAAのパターンを読む人は理解します):
<code class = "php"> class Db_Table extends Zend_Db_Table_Abstract {
/ **
* @return Zend_Db_Table_Rowset_Abstract
* /
パブリック関数fetchAllBy($キー、$値){
$ where = $ this-> getAdapter()-> quoteInto( "$ key =?"、$ value);
return $ this-> fetchAll($ where);
}
/ **
* @return Zend_Db_Table_Row_Abstract
* /
パブリック関数fetchRowBy($キー、$値){
$ where = $ this-> getAdapter()-> quoteInto( "$ key =?"、$ value);
return $ this-> fetchRow($ where);
}
パブリック関数__call($名前、$引数){
if(strpos($ name、 'fetchRowBy')=== 0){
array_unshift($引数、substr($名、10));
return call_user_func_array(array($ this、 'fetchRowBy')、$ arguments);
}
if(strpos($ name、 'fetchAllBy')=== 0){
array_unshift($引数、substr($名、10));
return call_user_func_array(array($ this、 'fetchAllBy')、$ arguments);
}
新しい例外をスロー(「未定義のメソッド$名前」);
}
}
クラスDb_RecordはZend_Db_Table_Row_Abstractを拡張します{
} </ code>
そして今、使用例:
<code class = "php"> class Item extends Db_Table {
protected $ _name = 'items';
protected $ _rowClass = 'ItemRecord';
protected $ _referenceMap = array(
'Group' =>配列(
'columns' => 'groupid'、
'refTableClass' => 'グループ'、
'refColumns' => 'groupid'、
)
);
}
クラスItemRecord extends Db_Record {
}
クラスGroupはDb_Tableを拡張します{
保護された$ _name = 'groups';
protected $ _rowClass = 'GroupRecord';
protected $ _dependentTables = array( 'Item');
}
クラスGroupRecordはDb_Recordを拡張します{
}
$ itemTable = new Item();
$ item = $ itemTable-> fetchRowBySlug( 'hello');
$ group = $ item-> findParentGroup(); </ code>
妥協者-すべてがシンプルで便利ですよね?
興味のある方は、Zend Frameworkのドキュメントから
Zend_Dbに関する章全体を読むことを強くお勧めします。 また、
Zend_Db_Tableに関する私の投稿は 、その改善に専念しています(現在どの程度関連性があるかはわかりませんが、確認する時間はありません:()。
ブログからのクロス投稿