2011-10-17 21 views
4

Zend_Dbの中であなたがいうだけで直接Rowオブジェクトをインスタンス化するよりも、新しい空のRowオブジェクトを取得するにはcreateRowメソッドを使用する必要があり、なぜ私は思ったんだけど。Zend_Db_Table_Rowは:なぜ私はcreateRow()を使用する必要がありますか?

たとえば、自分のUserテーブルと行クラスを作成するためにデフォルトクラスを拡張した場合、新しいRowオブジェクトを作成するためには、常に新しいRowオブジェクトを作成するために次のことを行う必要があります。

$userTable = new App_Table_User(); 
$userRow = $userTable->createRow(); 
$userRow->setName('bob'); 
$userRow->save(); 

しかし、私にはそれだけで言うことができるように、より理にかなって:

$userRow = new App_Row_User(); 
$userRow->setName('bob'); 
$userRow->save(); 

私はいつもZend_Db_Table_Row_Abstractを拡張し、私の行のクラスにこの機能を構築することができることを理解し、そこだ場合、私は思ったんだけど具体的な理由は、Zend Framewo rkチームはこれをデフォルトにしていませんでしたか?

答えて

4

newで直接行クラスをインスタンス化します。

しかしRowオブジェクトは、データの行に対して有効であるかの列を知っている必要があります。

それに対応するテーブルのクラス名に行のクラス名をマップする魔法はありません。したがって、Rowはそれ自体がどのテーブルに属しているのかを知りません。したがって、挿入操作または更新操作を実行するためのSQLの記述方法を推測することはできません。対応するZend_Db_Tableオブジェクトからこのメタデータを取得します。 Rowを使用するテーブルを指定する必要があります。

newで行オブジェクトを作成する場合は、テーブルクラス名またはそのテーブルクラスのオブジェクトインスタンスを含むコンフィギュレータに渡す必要があります。有効なテーブルオブジェクトまたはクラス名なし

$userRow = new App_Row_User(array('table' => 'App_Table_User')); 

それとも

$userTable = new App_Table_User(); 
$userRow = new App_Row_User(array('table' => $userTable)); 

newとRowオブジェクトをインスタンス化すると、例外がスローされます。

同様に、save()は、テーブルオブジェクトを使用して、insert()またはupdate()というメソッドを呼び出します。有効なテーブルオブジェクトがなければ、Rowのsave()メソッドは例外をスローします。

関連する問題