プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.6、Model_Crudついて理解する(1)データの登録・更新
FuelPHPではModel_Crudを継承したモデルを作成すると
あらかじめCRUD用のメソッドを含んだモデルになるのだそうな。
そこら辺をちょいと見ていこうかな、というのが今回のテーマです。

まずはテスト用のテーブルを作成φ(--)

CREATE TABLE IF NOT EXISTS `tbl_test01` (
  `pk_id` int(10) NOT NULL AUTO_INCREMENT,
  `column_varchar01` varchar(255) DEFAULT NULL,
  `column_int02` int(10) DEFAULT NULL,
  `column_varchar02` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`pk_id`),
  KEY `pk_id` (`pk_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

「pk_id」が自動採番のプライマリキー、
「column_varchar01」「column_varchar02」が文字列型のカラムで、
「column_int02」が数値型のカラムです。

次にModel_Crudを継承したモデルを作ってみるφ(--)

<?php
class Model_Test01 extends Model_Crud
{
    //使用するtable
    protected static $_table_name = "tbl_test01";

    //プライマリキー
    protected static $_primary_key = "pk_id";

    //データ検証用のルール
    protected static $_rules = array(
        'column_varchar01' => 'required'
    );

    //値未設定時のデフォルト値
    protected static $_defaults = array(
        'column_int02' => 100
    );
}

プロパティ「$_table_name」に使用するテーブルを指定、
プロパティ「$_primary_key」にプライマリキーを指定(キー項目名が「id」の場合は省略可)、
プロパティ「$_rules」に入力チェック用のルールを指定、
プロパティ「$_defaults」に未入力時のデフォルト値を指定しています。

ここまでが前準備です(--)b

それではデータを登録してみるφ(--)

public function action_add()
{
    //インスタンス生成
    $mt = Model_Test01::forge();

    //値設定
    $data = array(
        'column_varchar01' => 'あああ',
        'column_int02' => 10,
        'column_varchar02' => 'いいい',
    );
    $mt->set($data);

    //保存
    if(!$mt->save()){
        print "保存失敗";
    }else{
        print "保存成功";
    }
}

「forge()」でインスタンスを作って「set()」で投入用データを設定し
「save()」で実際にDBに保存しています。

次にデータを更新してみるφ(--)

public function action_update()
{
    //データ取得
    $mt = Model_Test01::find_by_pk(2);

    //値設定
    $data = array(
        'column_varchar01' => 'ううう',
        'column_int02' => 11,
        'column_varchar02' => 'えええ',
    );
    $mt->set($data);

    //保存
    if(!$mt->save()){
        print "保存失敗";
    }else{
        print "保存成功";
    }
}

「find_by_pk()」で既存データを取得して「set()」で値を上書きして
「save()」で保存(update)しています。

ちなみに既存データを取得しないでこんな書き方をするとφ(--)

public function action_update2()
{
    //インスタンス生成
    $mt = Model_Test01::forge();

    //値設定
    $data = array(
        'pk_id' => 2,
        'column_varchar01' => 'ううう',
        'column_int02' => 11,
        'column_varchar02' => 'えええ',
    );
    $mt->set($data);

    //保存
    if(!$mt->save()){
        print "保存失敗";
    }else{
        print "保存成功";
    }
}

エラーになります。
既存データの有無に寄らずプライマリキー「pk_id=2」の情報で「insert」しようとするみたいです。

fuel/core/classes/model/crud.php

の中を覗いてみたところ、「insert」か「update」の切り分けは
「$_is_new」プロパティでやっているようですね。
そして「$_is_new」プロパティは「is_new()」メソッドで強制的に上書きできるみたいです。

と言う訳で既存データを取得しない場合でも
こんなんしたらupdateになりましたφ(--)

public function action_update3()
{
    //インスタンス生成
    $mt = Model_Test01::forge();

    //値設定
    $data = array(
        'pk_id' => 2,
        'column_varchar01' => 'おおお',
        'column_int02' => 11,
        'column_varchar02' => 'かかか',
    );
    $mt->set($data);

    //update指定
    $mt->is_new(false);


    //保存
    if(!$mt->save()){
        print "保存失敗";
    }else{
        print "保存成功";
    }
}

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:FuelPHP  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事