スキーマ定義を記述すれば、ビューも通常のモデル(ActiveRecord)として使用することができます。と言ってもスキーマ定義を1から記述するのは面倒なので、既存のテーブルのスキーマ定義から必要な部分だけコピーするのが良いでしょう。
例えば、
Schemaタスクで書き出した下記のようなdiaryとuserのスキーマ定義があるとします。
lib/schema/Diary.php
class Schema_Diary
{
public static function get()
{
$cols = array();
$cols['id'] = array('type' => Sabel_Db_Type::INT, 'max' => 2147483647, 'min' => -2147483648, ...);
$cols['user_id'] = array('type' => Sabel_Db_Type::INT, 'max' => 2147483647, 'min' => -2147483648, ...);
$cols['title'] = array('type' => Sabel_Db_Type::STRING, 'min' => 0, 'max' => 255, ...);
$cols['body'] = array('type' => Sabel_Db_Type::TEXT, 'increment' => false, 'nullable' => false, ...);
$cols['added'] = array('type' => Sabel_Db_Type::DATETIME, 'increment' => false, 'nullable' => false, ...);
return $cols;
}
public function getProperty()
{
...
}
}
lib/schema/User.php
class Schema_User
{
public static function get()
{
$cols = array();
$cols['id'] = array('type' => Sabel_Db_Type::INT, 'max' => 2147483647, 'min' => -2147483648, ...);
$cols['name'] = array('type' => Sabel_Db_Type::STRING, 'min' => 0, 'max' => 20, 'increment' => false, ...);
$cols['password'] = array('type' => Sabel_Db_Type::STRING, 'min' => 0, 'max' => 32, ...);
$cols['email'] = array('type' => Sabel_Db_Type::STRING, 'min' => 0, 'max' => 255, 'increment' => false, ...);
$cols['added'] = array('type' => Sabel_Db_Type::DATETIME, 'increment' => false, 'nullable' => false, ...);
return $cols;
}
public function getProperty()
{
...
}
}
タイトル一覧表示時にその日記の投稿者名も表示したいということで、diary_userビューをデータベースに作成したとします。ビューの内容はdiaryにuserの名前(name)を結合しただけの単純なものとします。
※ビューの定義でuserの名前をuser_nameにしたこととします。
ビューを作成したら、あとは各スキーマ定義から必要なカラムだけコピーし、ビュー用のスキーマ定義を作成するだけです。
lib/schema/DiaryUser.php
class Schema_Diary
{
public static function get()
{
$cols = array();
$cols['id'] = array('type' => Sabel_Db_Type::INT, 'max' => 2147483647, 'min' => -2147483648, ...);
$cols['user_id'] = array('type' => Sabel_Db_Type::INT, 'max' => 2147483647, 'min' => -2147483648, ...);
$cols['user_name'] = array('type' => Sabel_Db_Type::STRING, 'min' => 0, 'max' => 20, 'increment' => false, ...);
$cols['title'] = array('type' => Sabel_Db_Type::STRING, 'min' => 0, 'max' => 255, ...);
$cols['body'] = array('type' => Sabel_Db_Type::TEXT, 'increment' => false, 'nullable' => false, ...);
$cols['added'] = array('type' => Sabel_Db_Type::DATETIME, 'increment' => false, 'nullable' => false, ...);
return $cols;
}
public function getProperty()
{
$property = array();
$property['tableEngine'] = null;
$property['uniques'] = null;
$property['fkeys'] = null;
return $property;
}
}
これで通常のテーブル(モデル)と同様に検索(取得)などが行えるようになります。もちろん
ページャにも使えます。
$diaries = finder("DiaryUser")->sort("added", "desc")->fetchAll();
foreach ($diaries as $aDiary) {
echo $aDiary->title . "(" . $aDiary->user_name . ")";
}