Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。

xFrameworkPXを使って見る(2) データベース操作

引き続き 「データベースの基本的な操作」のチュートリアルを順番にやってみます。

テーブルとリンクしたモジュールの作成

その通りやってもエラーが出るわけではないが,メッセージがちゃんと表示されないので,.index.php の9行目を

$this->set('module_data', $this->sample->testMethod());

のように()をつけたら動作した。

pxでは,モジュール名にtbl_ というプレフィックスをつけたテーブル名がデフォルトになるようです。モジュール名とは別に設定する場合は,usetable にテーブル名を代入すればいい。このプレフィックス自体もdatabase.pxmlの設定で変更できるような気配がします。既出ですがfalseを代入しておけば,テーブルは使わないモジュールになる。ここのサンプルでは単にテーブルがあるかどうか見ているだけ。

基本的なデータベース操作(1)

ここらへんから具体的な例が出てくる。複数行のデータ取得もある。
モジュールでは,$this->row メソッドの戻り値は1行のみで,$this-rowAll メソッドの戻り値は全行ということでしょうか。
コントローラーでは,モデルからの戻り値をそのまま,$this->set してます。たぶんどちらも連想配列なんじゃないかと思います。

単行データの方では,コントローラーでは $rowdata に値をセットしています。それをビューの方では,

<!--{$rowdata.id}-->

という書式で,フィールドを取り出しています。なるほど。

複数行の場合は,コントローラーでは, $alldata に値をセットしています。それをビューでは,

<!--{foreach from=$alldata item=item key=key}-->
    <tr>
        <td><!--{$item.id}--></td>
        <td><!--{$item.title}--></td>
        <td><!--{$item.note}--></td>
        <td><!--{$item.modified}--></td>
    </tr>
    <!--{/foreach}-->

ほぉ。こうしてループが書けるのか。これはSmartyの機能なんだろうか。なるほど。

「基本的なデータベース操作(2)」は,モジュールの $this->count でレコード数が取り出せるということですので飛ばします。

基本的なデータベース操作(3)

データの挿入。データの挿入は, モジュールの$this->insert()メソッドをつかうのですね。
フォームが出てきて,Webアプリらしくなってきます。

  • ビューのフォームは,自分自身に対してpostメソッドでデータを投函します。
  • コントローラーでは,$this->post プロパティを使ってデータを取り出して,それらがちゃんとセットされていたらモデルのindertData()メソッドでデータを挿入する。

サンプルをコピペしても動作はするのですが,.index.php のモジュールの参照が間違っていて,自分で作ったモジュールを読んでいません。

5行目の

public $modules = array('Docs_Tutorial_Database_Db3_sample');

public $modules = array('sample');

です。19行目と27行目

$this->Docs_Tutorial_Database_Db3_sample->insertData(
$alldata = $this->Docs_Tutorial_Database_Db3_sample->getDataAll();

それぞれ 

$this->sample->insertData(
$alldata = $this->sample->getDataAll();

という風にするのが正しいです。

面白いのは,モジュールのinsertDataメソッド。

public function insertData($id, $title, $note)
    {
        $this->insert(
            array(
                'field' => array(
                    'id',
                    'title',
                    'note',
                ),
                'value' => array(
                    ':id',
                    ':title',
                    ':note',
                ),
                'bind' => array(
                    'id' => $id,
                    'title' => $title,
                    'note' => $note,
                )
            )
        );
    }

$this->insert に渡している field と value は,

INSERT INTO () VALUES ()

のINSERT INTO 句のパラメータとVALUES句のパラメータですよね。そしてVALUES句にはコロンで始まるパラメータが設定されているので,bind のところで,それぞれのパラメータと値をひもつけている。という感じかな。

試しに,value のところを次のようにして bind の部分をなくしてしまっても動作しました。

'value' => array(
    $id,
    "'".$title."'",
    "'".$note."'",
)

このやり方では,上のようにちゃんと引用符でくくってやる必要があるようです。 

このフォームでは,ID欄に次の値がセットされていますが,コントローラーで全行取得後,最終行のIDプラス1をビューに渡しています。

 

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。