10

私は Zend Framework と MVC にかなり慣れていないので、Zend_DB とデータベースと対話する適切な方法に少し混乱しています。

私は PDO MySQL アダプターを使用しており、抽象クラスを拡張するクラスをいくつか作成しました。

class Users extends Zend_Db_Table_Abstract {
    protected $_name = 'users';
    protected $_primary = 'user_id';
    protected $_rowClass = 'User';

    public function getUserbyID($id) { /* code */ }
    // More code here
}
class User extends Zend_Db_Table_Row_Abstract {
    // Code here
}
class Widgets extends Zend_Db_Table_Abstract {
    protected $_name = 'widgets';
    protected $_rowClass = 'Widget';

    public function getWidgetsfromUser($userid) { /* code */ }
    // More code here
}
class User extends Zend_Db_Table_Row_Abstract {
    public function doSomethingWithWidget() { /* code */ }
    // More code here
}

DB (fetchAll()、find()、アダプターを介した fetchAll()、insert()、createRow()、および save()、select() オブジェクト) にアクセスする方法は非常に多くあるようで、いつも元に戻ってしまいます。私が何をすべきかを理解するためにドキュメントに。

SOは、準備されたステートメントが進むべき道であることを教えてくれました.行セットと行を使用しようとしましたが(そうすべきですか?)、データベースと対話するための最良の方法は何ですか?

(非常にオープンエンドな質問で申し訳ありません)

4

3 に答える 3

9

一般に、人々は、オブジェクト指向プログラミングの習慣に合わせるために、Table および Row オブジェクトを介してデータベースにアクセスすることを好みます。

OO アプローチは、クエリの入力または出力を変換または検証するコードを記述する必要がある場合に役立ちます。Table または Row クラスにカスタム メソッドを記述して、頻繁に必要なクエリをカプセル化することもできます。

ただし、オブジェクト指向のインターフェイスは単純化されており、実行する必要のあるすべてのタイプのデータベース操作を実行することはできません。そのため、SQLをより細かく制御する必要がある場合などquery()に、Zend_Db_Adapter メソッドに対してより深く掘り下げて SQL クエリを実行できます。fetchAll()

これは、データベースへのオブジェクト指向インターフェースではよくあることです。すべてのSQL 機能を複製できる OO レイヤーは、非常に複雑になります。妥協するために、オブジェクト指向層は通常、最も一般的なタスクを実行する簡単な方法を提供しようとしますが、必要に応じて隠れることができるようにします。

これは、非常に一般的な質問に対する非常に一般的な回答です。

于 2009-01-15T02:37:26.257 に答える
8

Zend_Db を使用する場合、準備済みステートメントなどの詳細には入りたくないでしょう。モデル オブジェクトを使用して基本的な CRUD (作成、読み取り、更新、および削除) を実行したいだけです。Programmer's Reference Guideが広範囲にわたることは知っていますが、Zend_Db の優れた入門書です。Zend_Db_Tableのドキュメントを詳しく見てみるとよいでしょう。

しかし、あなたの質問に素早く答えるためです。デフォルトの動作をオーバーライドする必要がない限り、Zend_Db_Table_Row_Abstract を拡張する必要はありません。また、おそらく Users クラスを次のように単純化できます。

class Users extends Zend_Db_Table_Abstract {
  protected $_name = 'users';

  // Code here
}

次に、それを使用するには、次を使用して言及したことのいくつかを実行します。

//Create a Users Model Object
$usersDb = new Users();

//Find the record with user_id = 4 and print out their name
$row = $usersDb->find(4);
echo $row->first_name . ' ' . $row->last_name

//Change the first name of this user to Brian    
$row->first_name = 'Brian';
$row->update();

//Insert a user into the database
$data = array(
  'first_name' => 'Gilean',
  'last_name' => 'Smith');
$usersDb->insert($data);

//Retrieve all users with the last name smith and print out their full names
$rows = $usersDb->fetchAll($usersDb->select()->where('last_name = ?', 'smith'));    
foreach ($rows as $row) {
  echo $row->first_name . ' ' . $row->last_name
}
于 2009-01-15T02:35:45.263 に答える
4

save メソッドを使用することをお勧めします。

//Create a Users Model Object
$usersDb = new Users();

//Find the record with user_id = 4 and print out their name
$row = $usersDb->find(4);
echo $row->first_name . ' ' . $row->last_name

//Change the first name of this user to Brian    
$row->first_name = 'Brian';
$row->save();

//Insert a user into the database
$newUser = $usersDb->fetchNew();
$newUser->first_name = 'Gilean';
$newuser->last_name  = 'Smith';
$newUser->save();

// OR if you get your data from post or any array
$newUser = $usersDb->fetchNew();
$newUser->setFromArray($data_from_post);
$newUser->save();

私がこのアプローチをより気に入っている理由は、常にユーザー モデルのインスタンスがあり、その中にカスタム メソッド ( ex isAdmin ) を含めることができるからです。それらが挿入/更新される前に何かをする。

于 2009-03-05T22:38:11.120 に答える