FuelPHPをやってみる (27) - Model_Softを使う -
FuelPHP1.5から追加された模様なModel_Softを使ってみる
一般的な削除処理を行わずに削除フラグを立たせて管理するような感じ。でこいつコアパッケージじゃなくてOrmパッケージに含まれているらしいので、それに伴う設定は事前にやっておく
fuel/app/classes/model/sample.php
<?php
class Model_Sample extends Orm\Model_Soft {
protected static $_properties = array("id", "name", "deleted_at");
protected static $_soft_delete = array(
"deleted_field" => "deleted_at",
"mysql_timestamp" => false
);
}
$_soft_deleteで削除フラグを持つカラムを設定しておく。型はintとか日付型が使える模様で、日付型使うのであればmysql_timestampをtrueにしとくとか(そこら辺は検証してない)
で$_propertiesにも削除フラグを示すカラム定義しておかないとエラーになるので
fuel/app/classes/controller/home.php
<?php
class Controller_Home extends Controller {
public function get_index() {
// 削除フラグの立ってないデータを取得
$entries = Model_Sample::find("all");
// 削除フラグの立ってるデータを取得
$deleted = Model_Sample::find_deleted();
return View::forge(
"index.html",
array(
"entries" => $entries,
"deleted" => $deleted
)
);
}
public function get_delete($id) {
$entry = Model_Sample::find($id);
if (!is_null($entry)) {
$entry->delete();
}
return Response::redirect("/");
}
public function get_restore($id) {
$entry = Model_Sample::find_deleted($id);
if (!is_null($entry)) {
// restoreメソッド使っても同じ。ソース上ではundeleteはrestoreを使ってる
$entry->undelete();
}
return Response::redirect("/");
}
}
な感じでModel_Softのdelete、undelete(もしくはrestore)のAPIを使う事でデータ自体は削除されないけど、削除フラグが立ったり消えたりする。で削除フラグが立ってるデータ自体はfindメソッドを使っても参照されない模様
<html>
<body>
<div>
<h4>Live (<?php echo count($entries) ?>)</h4>
<?php foreach ($entries as $entry) { ?>
<div>
<?php echo $entry["name"] ?>
<a href="/delete/<?php echo $entry["id"] ?>">デス</a>
</div>
<?php } ?>
</div>
<div>
<h4>Deleted (<?php echo count($deleted); ?>)</h4>
<?php foreach ($deleted as $entry) { ?>
<div>
<?php echo $entry["name"] ?>
<a href="/restore/<?php echo $entry["id"] ?>">レイズ</a>
</div>
<?php } ?>
</div>
</body>
</html>
なビューを作っといてやると
な感じになる。あくまでこのModel_Softを使う理由として挙げられるのが http://d.hatena.ne.jp/Kishi/20071116/1195207837 なんじゃないかって所