FuelPHPをやってみる (28) - OrmModel_Temporal -

2013-05-08T00:00:00+00:00 FuelPHP PHP

FuelPHP 1.6 Release(祝)

っていう事で1.6から追加された模様気なOrmModel_Temporalを使ってみる。まずこれなんなのかって、バージョニング出来るモデルみたいな感じなのかなと。で

What"s Temporal model FuelPHP東京勉強会03 from Takayuki Yamaguchi

ぶっちゃけこれ見た方が概要全て解説されているかと思いますんで、是非一読される事をオススメします。っていうか自分もこれ見てやってみただけなので

fuel/app/models/sample.php

<?php

class Model_Sample extends Orm\Model_Temporal {

    protected static $_table_name = "sample";

    protected static $_primary_key = array(
        "id",
        "temporal_start",
        "temporal_end"
    );

    protected static $_temporal = array(
        "start_column" => "temporal_start",
        "end_column" => "temporal_end",
        "mysql_timestamp" => true
    );
}

っつー感じでOrmModel_Temporalを継承したモデルクラスを定義。ドキュメントと違うのはmysql_timestampがtrueなくらい。あとマイグレーション的なの作っとけば

<?php

namespace Fuel\Migrations;

class Sample {
    public function up() {
        DBUtil::create_table(
            "sample",
            array(
                "id" => array(
                    "type" => "int",
                    "auto_increment" => true,
                "constraint" => 11
            ),
            "name" => array("type" => "text"),
                "temporal_start" => array("type" => "datetime"),
                "temporal_end" => array("type" => "datetime")
            ),
            array("id", "temporal_start", "temporal_end")
        );
    }

    public function down() {
    }
}

な感じかと。で本題はこれから、ただモデル定義しただけなので

でOrm\Model_Temporalの特徴だと思われる「find(ID)->saveしてもupdateでは無く、同一のIDを持ったINSERTが行われる」模様。もちろんoverwriteメソッドを使う事でリビジョン管理をする事無く同一のIDをupdateする事は出来る。コード的に書くと

$model = Model_Sample::forge();
$model->name = "test1";
$model->save(); // 普通にsave

$model = Model_Sample::find(1);
$model->name = "test2";
$model->save(); // updateと思いきやinsertになる。レコード的には同一IDが存在する

$model = Model_Sample::find(1);
$model->name = "test3";
$model->overwrite(); // insertと思いきや、これはupdate

$model->delete(); // 削除できるし、findしてもnullにしかならないけどレコード自体は削除されていない

// deleteしたレコードはrestoreで復元出来る
$model = Model_Sample::find_revision(1, "2013-05-08 xx:xx:xx")->restore();

// purgeをすればレコード自体にもリビジョンを残さず削除出来る
$model->purge();

っていう感じっぽい。でfind("all")とかしちゃったらどうなるのか、コントローラーで

<?php

class Controller_Sample extends Controller {
    public function action_index() {
        $samples = Model_Sample::find("all");

        foreach ($samples as $sample) {
            var_dump($sample);
        }

        return Response::forge();
    }
}

なやつを

  • 普通にsave (2回)
  • find(1)してsave
  • find(1)してoverwrite
  • 再度、find(1)してsave

した場合

になり、レコード的には

+----+-------+---------------------+---------------------+
| id | name  | temporal_start      | temporal_end        |
+----+-------+---------------------+---------------------+
|  1 | test3 | 2013-05-08 13:47:17 | 2013-05-08 13:51:51 |
|  1 | test4 | 2013-05-08 13:51:51 | 2038-01-18 22:14:08 |
|  2 | test2 | 2013-05-08 13:51:07 | 2038-01-18 22:14:08 |
+----+-------+---------------------+---------------------+

同一IDなのは後に処理された方のみがfind("all")では列挙される形にはなる。という感じでModel_Softを使った論理削除方式とはちょっと違う方式を利用できる模様。

公式ドキュメント: http://fuelphp.com/docs/packages/orm/model/temporal.html

FuelPHPをやってみる (29) - Orm\Auth - Eclipseで引数とかを改行するとインデントが2倍になる