「ちいたん」はインクルードするだけで使えるお手軽PHPフレームワークです。「ちいたん」には、シンプルなモデルクラスが用意されています。CakePHPのように関連テーブルからもデータを引っ張ってくる機能はデフォルトでは付いていませんので、複雑な呼び出しにはSQLの知識が必要になりますが、「簡単な呼び出しはモデル関数で」「複雑な呼び出しはSQL文で」と使い分けができて非常にすっきりしたコードが書けます
まず先に、データベースの設定をしておきます。

データベースの設定

ちいたんスタートアップ にも書いたように、設定ファイルを用意してデータベースの設定を記述します。
//config.php
function config_database(&$db){
   $db->add("","localhost","user","pass","db_name");
}
複数データベースを利用する場合は、第一引数に設定名を入れておきます。
//config.php
function config_database(&$db){
   $db->add("","localhost","user1","pass1","db_name1");
   $db->add("db2","localhost","user2","pass2","db_name2");
}
また、データベースの種類やポートを指定する場合は、
//config.php
function config_database(&$db){
   //MySQL(デフォルト)
   $db->add("","localhost","user","pass","db_name");
   //MySQL, another database
   $db->add("another","localhost","user2","pass2","db_name2");
   //MySQL, port:8889 正式な書き方
   $db->add("mysql","localhost","user","pass","db_name",DBKIND_MYSQL,8889);
   //MySQL, port:8889 これでもいける
   $db->add("mysql2","localhost:8889","user","pass","db_name");
   //PgSQL
   $db->add("pgsql","localhost","user","pass","db_name",DBKIND_PGSQL);
   //TextSQL
   $db->add("textsql","localhost","user","pass","db_name",DBKIND_TEXTSQL);
}
などとします。

次にテーブルの設定です。例として「ブログシステム」のテーブル構成を想定して、記事リストを表示するまでの流れを見てみましょう。

テーブルの設定

ブログのエントリが、entryというテーブルに入っているとしましょう。このテーブルにアクセスするためにまずやることは「entryクラスを作成」して「ちいたん に登録」する事です。

entryクラスは entry.php という名前で以下のように作成して、適当な場所に保存します。クラス名は entry の頭文字を大文字にして、先頭にCを付けた CEntry になります。
//entry.php
class CEntry extends CModel{
}
次に「ちいたん」への登録です。作成した entry.php を、設定ファイルに書き加えます。
//config.php
function config_database(&$db){
   $db->add("","localhost","user","pass","db_name");
}
function config_models(&$controller){
   $controller->AddModel("***/entry.php");
}
もし、複数データベースを利用している場合は、データベースの設定名もセットしておきます。
//config.php
function config_database(&$db){
   $db->add("","localhost","user","pass","db_name");
   $db->add("mysql2","localhost","user2","pass2","db_name2");
}
function config_models(&$controller){
   $controller->AddModel("***/entry.php","mysql2");//mysql2
}

データベースへのアクセス

それではいよいよ、entryテーブルにアクセスしてみます。設定ファイルと「cheetan.php」を読み込んで、処理を action 関数内に記述します。
require_once "config.php";
require_once "cheetan/cheetan.php";

function action(&$c)
{
   $entry_list = $c->entry->find("","date desc");
   print_r($entry_list);
}
action は特別な関数です。この関数を定義する事で「ちいたん」のコントローラー $c を取得でき、「ちいたん」の便利な関数やオブジェクト群にアクセスできるようになります。上の例では、コントローラーから entry テーブルのオブジェクトにアクセスし、findでレコードの配列を取得しています。find は、テーブルのレコードを取得するモデル関数です。

find で取得した配列の中身は例えば、こんなふうになります。
Array
{
   [0] => Array
         (
            [id] => 0
            [title] => ちいたんスタートアップ
            [body] => 世界最軽量PHP用MVCフレームワーク「ちいたん」...
            [date] => 2007-12-27 06:06:07
         )

   [1] => Array
         (
            [id] => 1
            [title] => 「ちいたん」のDBモデルを使う
            [body] => 「ちいたん」には、シンプルなモデルクラスが...
            [date] => 2008-03-07 17:44:20
         )
}

データをビューに渡す

取得したデータをHTMLに整形して書き出してみます。
<?
require_once "config.php";
require_once "cheetan/cheetan.php";

function action(&$c)
{
   $entry_list = $c->entry->find("","date desc");
   $c->set('entry_list',$entry_list);
}

$entry_list = $data['entry_list'];
?>
<html>
<head>
<title></title>
</head>
<body>
<?
foreach($entry_list as $entry)
{
   echo "<p>";
   echo $entry['title']."<br>";
   echo $entry['body']."<br>";
   echo $entry['date'];
   echo "</p>";
}
?>
</body>
</html>
実際は action 関数内でスクリプトを完結させる事もできるのですが、ここでは一旦必要なデータをビューに渡しています。
$c->set('entry_list',$entry_list);
セットした変数はグローバル変数 $data からアクセスできます。
$entry_list = $data['entry_list'];
こうしておくことで、後々ビューの便利な機能(テンプレート機能など)が使えるようになります。

その他のデータ取得関数

「ちいたん」のモデルには、以下ののデータ取得関数が用意されています。

array find($condition,$order,$limit,$group)
//レコードリストを取得して、配列で返す
find("id=1","date","10");
find("id=1 and cat_id=1","date desc","0,10");
find("title='test'","date desc","0,10","member_id");

*レコードが見つからなかった場合は空の配列が返る
array findone($condition,$order)
//レコードを一つだけ取得し、連想配列として返す。
//内部的には、上の find に limit を付けて渡しています。
findone("id=1");
findone("author='sandman'");
$item = findone("member_id=2 and cat_id=1","date desc");

*レコードが見つからなかった場合はFALSEが返る
array findquery($query,$condition,$order,$limit,$group)
//リレーションを想定したfindで、$query部分にselect〜where以前までを記述
$query = "SELECT entry.*,cat.cat_name from entry";
$query.= " left join cat on entry.cat_id=cat.id";
$list = findquery($query,"entry.author='sandman'","date desc",10);

*レコードが見つからなかった場合は空の配列が返る
int getcount($condition,$limit)
//条件に合うレコード数を取得
getcount("");//全レコード数
getcount("author='sandman'");

*レコードが見つからなかった場合は0が返る
デフォルトで定義されているデータ取得関数は以上です。 あとはテーブル毎に、独自の関数を定義してみましょう。
//entry.php
CEntry extends CModel{
   function last_entry(){
      return $this->findone("","date desc");
   }
}

2008年03月07日17時44分20秒
カテゴリ: ちいたん