2010年2月4日木曜日

Zend_Db_Table(その6) 追加、更新、削除、トランザクション

テーブルへのデータ追加、更新、削除とトランザクションについて、とりあえずメモ

(1)データ追加
データの追加は、行を新しく作ってから、保存するやりかたと、直接データを追加する2つの方法がある。

a)空行を作ってから保存
テーブルクラスのcreateRowメソッドを使って、新しく行オブジェクトを作成して、データを設定し、Rowオブジェクトのsave()メソッドを使って保存をする。

コード例)
$table=new Hoge();
$row=$table->createRow();         
$row->name="sample";
$newid=$row->save();


b)直接データ追加
テーブルクラスのinsert()メソッドを使って、データを直接テーブルに追加する。

コード例)
$table=new Hoge();
$newid=.$table->insert(
  array("name"=>"sample")
);


createRow()メソッドで行オブジェクトを作った場合、値を設定した以外の項目はnullが入るため、テーブル定義でデフォルト値を設定するようにしていても意味がなくなる。
SQL発行をProfilerで見ると、createRow()=>save()で追加を行った場合、新しく割り当てられた主キーの値を取得するためにselect文を実行しているので、insert()を使うよりもSQLが1つ多く発行されていることになる。

createRow()メソッドを使う方法の方が、更新とほぼ同じ手順データ操作が行えるので、いい感じだけど、insert()を使ったほうが、デフォルト値などの設定の手間を考えると、問題が少ないかも。



(2)データ更新
データの更新は、更新行を入手してから、値を変更し、テーブルへ更新する方法と、直接条件を指定してデータを更新する2つの方法がある。

a)対象行を入手してから更新
テーブルクラスから、find(),fetchRow(),fetchAll()などのメソッドを使って、更新対象となる行オブジェクト(Zend_Db_Table_Row)を取得し、項目の値を変更したとRowオブジェクトのsave()メソッドを 使って保存をする。

コード例)
$table=new Hoge();

$row=$table->fetchRow($table->select()->where("id=?",1);         
$row->name="sample";
$row->save();

b)条件を指定して直接データ更新
テーブルクラスのupdate()メソッド を使用し、更新データと検索条件を指定し、テーブルのデータを更新する。

コード例)
$table=new Hoge();

$count=.$table->update(
  array("name"=>"sample"),
  $table->getAdapter()->quoteInto("id=?",1)
);
update()の2つ目の引数には、SQLの条件を記入する。
単に文字列を渡すことになるため、クォート処理などは行ってくれない。
このため、テーブルアダプタのquoteInto()やquoute()メソッドなどを利用して、クォート処理をしておくこと。

updateは条件の指定次第で複数行にを一度に更新ができる。全レコード対象とする場合は、update()の2番目の引数にnullを設定する。

update()は更新内容、条件が同じ場合に利用し、Rowオブジェクトのsave()メソッドを利用する場合は、更新内容や、レコードの特定項目の条件あわせて変更するような場合に利用する。

(3)データ削除
データの削除は、更新の場合と同様に、対象行を入手してから、削除する方法と、直接条件を指定して削除する2つの方法がある。

a)対象行を入手してから削除
テーブルクラスから、find(),fetchRow(),fetchAll()などのメソッドを使って、更新対象となる行オブジェクト (Zend_Db_Table_Row)を取得し、項目の値を変更したとRowオブジェクトのdelete()メソッドを 使って削除する。

コード例)
$table=new Hoge();

$row=$table->fetchRow($table->select()->where("id=?",1);
$row->delete();

b)条件を指定してデータ削除
テーブルクラスのdelete()メソッド を使用し、検索条件を指定してデータを削除する。

コード例)
$table=new Hoge();

$count=.$table->delete(
  $table->getAdapter()->quoteInto("id=?",1)
);

delete()の2つ目の引数には、SQLの条件を記入する。
クォート処理などは行わないのは更新の場合と同様

(4)トランザクション
 通常Zend_Db_Tableなどへの更新操作は、自動的に操作単位でコミットされる。
複数の操作に対して、トランザクション制御を行いたい場合は、アダプタークラスのbeginTransaction()、commit()、rollback()メソッドを利用する。

コード例)
$table=new Hoge();
$table->getAdapter()->beginTransaction();
try{
   //テーブルへの操作など
   $table->getAdapter()->commit();
}catch (Exception $e){
  $table->getAdapter()->rollback();
}

0 件のコメント: